学习设计模式2装饰模式
装饰模式结构
装饰模式是为了在已有的功能上添加额外的功能的一种方式,对已经有的方法再进行装饰
应用场景:当需求是需要向系统中,旧代码中添加新的代码时使用,比如以前的代码是发送一个接口请求,这个时候你需要为其进行加密,或则进行敏感词过滤,我们最直接的思维就是直接修改代码,但是这个时候可以使用装饰模式,对之前的旧的方法(就一个请求)进行装饰。这样就不会修改原来的代码。但是最好是使用装饰的时候,是独立的模块,不会因为顺序而影响的模块。
-
抽象的对象
package 结构; /** * @Program: 设计模式 * @Description: 对象接口,可以为其动态的添加一些功能 * @Author Mokairui * @Date 2020/12/2 20:12 */ public interface Component { /** * 一个接口方法功能 */ void operation(); }
-
具体的对象
package 结构; /** * @Program: 设计模式 * @Description: 一个具体的对象,可以为这个具体的对象添加具体的操作 * @Author Mokairui * @Date 2020/12/2 20:20 */ public class CreateComponent implements Component { @Override public void operation() { System.out.println("具体对象的操作"); } }
-
装饰对象
package 结构; /** * @Program: 设计模式 * @Description: 实现Component类,从外部扩展Component的功能 * @Author Mokairui * @Date 2020/12/2 20:21 */ public abstract class Decorator implements Component { protected Component component; public void setComponent(Component component) { this.component = component; } @Override public void operation() { if (null != component) { component.operation(); } } }
-
具体的装饰对象
package 结构; /** * @Program: 设计模式 * @Description: 具体的装饰对象,起到给Component添加职责的功能 * @Author Mokairui * @Date 2020/12/2 20:33 */ public class CreateDecorateA extends Decorator { // 用户区别装饰对象B private String addState; @Override public void operation() { super.operation(); addState = "New State"; System.out.println("具体装饰对象A的操作"); } }
package 结构; /** * @Program: 设计模式 * @Description: 具体的装饰对象,起到给Component添加职责的功能 * @Author Mokairui * @Date 2020/12/2 20:34 */ public class CreateDecoratorB extends Decorator { @Override public void operation() { super.operation(); test(); System.out.println("具体装饰对象B的操作"); } // 用于区别装饰对象A public void test() { } }
装饰模式例子
在结构类图和例子的类图中显示,其实要使用时创建的对象只有两类,一类有具体实现功能方法的类(以前的旧方法),第二类就是具体的装饰类。而后装饰类里面有个装饰方法(在上面例子结构中就是Decorate方法),然后用具体的装饰对象调用装饰方法,参数就是需要装饰的实体对象。
-
Person类
package example; /** * @Program: 设计模式 * @Description: 结构中的CreateComponent类 * @Author Mokairui * @Date 2020/12/3 19:02 */ public class Person { private String name; public Person() { } public Person(String name) { this.name = name; } public void show() { System.out.println("装扮衣服的" + name); } }
-
Finery服饰类,也就是装饰类
package example; /** * @Program: 设计模式 * @Description: 服饰类 * @Author Mokairui * @Date 2020/12/3 19:07 */ public class Finery extends Person { protected Person component; // 装饰 public void Decorate(Person component) { this.component = component; } @Override public void show() { if (null != component) { component.show(); } } }
-
具体的装饰对象
package example; /** * @Program: 设计模式 * @Description: 具体的服饰类 * @Author Mokairui * @Date 2020/12/3 19:24 */ public class TShirts extends Finery { @Override public void show() { System.out.print("大T恤"); super.show(); } }
package example; /** * @Program: 设计模式 * @Description: 具体的服饰类,装饰类 * @Author Mokairui * @Date 2020/12/3 19:27 */ public class BigTrouser extends Finery { @Override public void show() { System.out.print("打跨裤"); super.show(); } }
-
测试
package example; /** * @Program: 设计模式 * @Description: 测试类 * @Author Mokairui * @Date 2020/12/3 19:28 */ public class Demo { public static void main(String[] args) { Person person = new Person("马儿扎哈"); TShirts ts = new TShirts(); BigTrouser bt = new BigTrouser(); ts.Decorate(person); ts.show(); System.out.println("------------------"); bt.Decorate(person); bt.show(); System.out.println("-------------------"); ts.Decorate(person); bt.Decorate(ts); bt.show(); } }
在结构类图和例子的类图中显示,其实要使用时创建的对象只有两类,一类有具体实现功能方法的类(以前的旧方法),第二类就是具体的装饰类。而后装饰类里面有个装饰方法(在上面例子结构中就是Decorate方法),然后用具体的装饰对象调用装饰方法,参数就是需要装饰的实体对象。