本文主要是介绍装饰者模式(附与代理模式的区别,乍看挺像),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一.装饰模式介绍
装饰模式也称为包装模式,结构设计模式之一,就像房子一个,房子盖好都是毛坯房,但是装修之后,有简单装修,精装修,豪华装修,各有不同,这个就可以理解为装饰模式,不管你怎么装修,最开始都是毛坯房,或者一个人每天穿不同的衣服(装饰),但是本质还是同一个人没有发生改变。
二.装饰模式的定义
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类而言更加简单
三.装饰模式的使用场景
需要透明并且动态的扩展类的功能时。
四.简单实现
//Component.java
public abstract class Component {/*** 抽象的方法* */public abstract void operate();
}
//ConcreteComponent.java
public class ConcreteComponent extends Component {@Overridepublic void operate() {System.out.println("xcqw 我是小明");}
}
//Decorator.java
public abstract class Decorator extends Component {private Component component;//持有一个Component对象的引用/*** 必要的构造方法 需要一个Component类型的对象* */public Decorator(Component component) {this.component = component;}@Overridepublic void operate() {component.operate();}
}
public class ConcreteDecoratorA extends Decorator {/*** 必要的构造方法 需要一个Component类型的对象** @param component*/public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void operate() {//装饰方法A和B (也就是带了个帽子 ,穿了双跑鞋)super.operate();}public void operateA(){//装饰方法逻辑System.out.println("我戴了帽子");}public void operateB(){//装饰方法逻辑System.out.println("我穿了双跑鞋");}
}
//ConcreteDecoratorB
public class ConcreteDecoratorB extends Decorator {/*** 必要的构造方法 需要一个Component类型的对象** @param component*/public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void operate() {//装饰方法A和B (也就是带了个大金链子 ,穿了木屐)super.operate();}public void operateA(){//装饰方法逻辑System.out.println("我带了个大金链子");}public void operateB(){//装饰方法逻辑System.out.println("我穿了木屐");}
}
//MainActivity.java
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//构造被装饰的组件对象Component component = new ConcreteComponent();//根据组件对象构造装饰者对象A并调用,此时相当于给组件对象增加装饰者A的方法Decorator decoratorA = new ConcreteDecoratorA(component);decoratorA.operate();//根据组件对象构造装饰者对象B并调用,此时相当于给组件对象增加装饰者B的方法Decorator decoratorB = new ConcreteDecoratorB(component);decoratorB.operate();}
}
结果可以看到 一个是戴帽子穿跑鞋的小明,一个则是代金链子,穿木屐的小明,着装风格不一样,但是都是小明
Component:抽象组件
可以是一个接口或者抽象类,其充当的就是被装饰的原始对象
ConcreteComponent:组件具体实现类
该类是Component类的基本实现,也就是我们装饰的具体对象(也就是小明)。
Decorator:抽象装饰者
装饰我们的组件对象,其内部一定要有一个指向组件对象的引用。
ConcreteDecorateA:装饰着具体实现类
只是对抽象装饰着作出具体的实现(具体扩展的方法,精装修还是豪华装修)
ConcreteDecorateB:装饰着具体实现类
只是对抽象装饰着作出具体的实现(具体扩展的方法,精装修还是豪华装修)
Client :客户类
五.Android源码中的模式实现
在Android中常用的Context就使用了装饰者模式,看图就很清晰了
六.跟代理模式的区别
一句话,装饰者模式是增强对象功能(穿不同的衣服),代理模式是控制代理的对象,但不对其做功能增加
这篇关于装饰者模式(附与代理模式的区别,乍看挺像)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!