设计模式(10)-装饰模式详解(易懂)

2018-02-27 11:17:37来源:https://www.jianshu.com/p/183ab49b5f54作者:安卓干货铺人点击

分享


装饰模式的定义

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。


模型:




image

Component:抽象组件,是一个接口或者抽象类;就是定义的最原始的对象


ConcreteComponent:具体组件,实现类(需要装饰)


Decorator:装饰角色,一般是抽象类,实现接口;它的属性必然有个private变量指向Conponent抽象组件


ConcreteDecorator:具体的装饰对象


实例说明

举个例子:比如一个正在上高中的学生“小明”在考完试后,和父母说想买一款5000元的手机。


1.Component,抽象方法-买手机



public abstract class AbstractBuyPhone {
//主要是向父母提出想买手机的意向
public abstract void BuyPhone();
//父母是否同意
public abstract void Agree();
}

2.ConcreteComponent:具体的意向



public class XiaoMingBuyPhone extends AbstractBuyPhone {
@Override
public void BuyPhone() {
Log.d("qzs","我想买一款华为的5000元的手机");
}
@Override
public void Agree() {
Log.d("qzs","父母同意了");
}
}

3.Decorator,增加一个装饰抽象类,方便修饰



public class AbstractDecorator extends AbstractBuyPhone {
private AbstractBuyPhone abstractBuyPhone;
public AbstractDecorator ( AbstractBuyPhone abstractBuyPhone){
this.abstractBuyPhone=abstractBuyPhone;
}
@Override
public void BuyPhone() {
this.abstractBuyPhone.BuyPhone();
}
@Override
public void Agree() {
this.abstractBuyPhone.Agree();
}
}

4.ConcreteDecorator:如果直接去找父母要手机,很容易被拒绝,所以需要修饰一下,这里用成绩修饰一下



public class ScoreDecortator extends AbstractDecorator {
public ScoreDecortator(AbstractBuyPhone abstractBuyPhone) {
super(abstractBuyPhone);
}
//先和父母说说自己的成绩
private void ShowScore(){
Log.d("qzs","我这次考试的成绩年级前三,又进步了");
}
//重写买手机的方法,先汇报成绩,然后再提买手机的事情
@Override
public void BuyPhone() {
this.ShowScore();
super.BuyPhone();
}
}

5.调用,也就是请求父母:



AbstractBuyPhone str;
//小明的原本意向
str=new XiaoMingBuyPhone();
//修饰后的意向
str=new ScoreDecortator(str);
//向父母提出想法(成绩和买手机)
str.BuyPhone();
//父母同意了
str.Agree();

运行结果:




image

强调:这里只加了分数的修饰,可以加多个修饰类来满足你最后的目的


装饰模式的优缺点及其他

1.优点


Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。


通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。


2.缺点


这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。


装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。


装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。


3.适用场景


需要扩展一个类的功能,或给一个类添加附加职责。


需要动态的给一个对象添加功能,这些功能可以再动态的撤销。


定义和优缺点来自网上百度信息


另外可以加入我的Android技术交流群:458739310
大家可以关注我的微信公众号:「安卓干货铺」一个有质量、有态度的公众号!












最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台