装饰模式

装饰模式(Decorator),动态地给一个对象添加一些额外的职责。

Component是抽象构件,定义一个对象接口,可以给这些对象动态地添加职责;
ConreteComponent定义一个具体对象,也可以给这个对象添加一些职责;
Decorator是装饰抽象类,实现接口或抽象方法;
ConreteDecorator是具体装饰对象,起到给Component添加职责的功能。
实例:描述一个人
源代码:基本实现功能

package org.zangyu.Decorator;public class Decorator {public static void main(String[] args) {// TODO Auto-generated method stubHighC hc =new HighC();hc.setName("姚明");RichC rc=new RichC();rc.setName("马云");HRUSA hrusa =new HRUSA();hrusa.setName("Tom");hc.desc();rc.desc();hrusa.desc();}}
abstract class Person{//公共基类,含有公共方法String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void desc();}
//主体类:中国人,美国人两个类
class Chinese extends Person{@Overridepublic void desc() {// TODO Auto-generated method stubSystem.out.println(name+"是中国人");}}
class USA extends Person{@Overridepublic void desc() {// TODO Auto-generated method stubSystem.out.println(name+"是美国人");}}
//扩展操作,对各国人进行操作
class HighC extends Chinese{public void desc() {super.desc();System.out.println("高");}
}
class RichC extends Chinese{public void desc() {super.desc();System.out.println("富");}
}
class HRC extends Chinese{public void desc() {super.desc();System.out.println("高富");}
}
class HighUSA extends USA{public void desc() {super.desc();System.out.println("高");}
}
class RichUSA extends USA{public void desc() {super.desc();System.out.println("富");}
}
class HRUSA extends USA{public void desc() {super.desc();System.out.println("高富");}
}

缺点:
结果往往是随着需求的变化,子类急剧增多,同时充斥着重复代码,需要划清职责问题

源代码:
改进——组合代替继承

package org.zangyu.Decorator;public class Decorator {public static void main(String[] args) {// TODO Auto-generated method stubChinese p=new Chinese();p.setName("姚明");HighC hc =new HighC(p);hc.desc();p.setName("马云");RichC rc=new RichC(p);rc.desc();USA p1 =new USA();p1.setName("Tom");HRUSA hrusa =new HRUSA(p1);hrusa.desc();}}
abstract class Person{//公共基类,含有公共方法String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void desc();}
//主体类:中国人,美国人两个类
class Chinese extends Person{@Overridepublic void desc() {// TODO Auto-generated method stubSystem.out.println(name+"是中国人");}}
class USA extends Person{@Overridepublic void desc() {// TODO Auto-generated method stubSystem.out.println(name+"是美国人");}}
//扩展操作,对各国人进行操作
//组合代替继承
class HighC {Chinese person;public HighC(Chinese person) {this.person=person;}public void desc() {person.desc();System.out.println("高");}
}
class RichC {Chinese person;public RichC(Chinese person) {this.person=person;}public void desc() {person.desc();System.out.println("富");}
}
class HRC {Chinese person;public HRC(Chinese person) {this.person=person;}public void desc() {person.desc();System.out.println("高富");}
}
class HighUSA {USA person;public HighUSA(USA person) {this.person=person;}public void desc() {person.desc();System.out.println("高");}
}
class RichUSA {USA person;public RichUSA(USA person) {this.person=person;}public void desc() {person.desc();System.out.println("富");}
}
class HRUSA {USA person;public HRUSA(USA person) {this.person=person;}public void desc() {person.desc();System.out.println("高富");}
}

改进——积累代替子类效除编译依赖
源代码:

package org.zangyu.Decorator;public class Decorator2 {public static void main(String[] args) {// TODO Auto-generated method stubChinese p=new Chinese();p.setName("姚明");HighP hc =new HighP(p);hc.desc();p.setName("马云");RichP rc=new RichP(p);rc.desc();USA p1 =new USA();p1.setName("Tom");HRP hrusa =new HRP(p1);hrusa.desc();}}
abstract class Person{//公共基类,含有公共方法String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void desc();}
//主体类:中国人,美国人两个类
class Chinese extends Person{@Overridepublic void desc() {// TODO Auto-generated method stubSystem.out.println(name+"是中国人");}}
class USA extends Person{@Overridepublic void desc() {// TODO Auto-generated method stubSystem.out.println(name+"是美国人");}}
//扩展操作,对各国人进行操作
//组合代替继承
//基类代替子类消除编译时的依赖
class HighP {Person person;public HighP(Person person) {this.person=person;}public void desc() {person.desc();System.out.println("高");}
}
class RichP {Person person;public RichP(Person person) {this.person=person;}public void desc() {person.desc();System.out.println("富");}
}
class HRP {Person person;public HRP(Person person) {this.person=person;}public void desc() {person.desc();System.out.println("高富");}
}

数据重构:当类中含有重复的字段和方法就应当提到积累里
解决:设计一个中间基类——装饰模式 

package org.zangyu.Decorator;public class Decorator3 {public static void main(String[] args) {// TODO Auto-generated method stubChinese p=new Chinese();p.setName("姚明");HighP hc =new HighP(p);hc.desc();p.setName("马云");RichP rc=new RichP(p);rc.desc();USA p1 =new USA();p1.setName("Tom");HighP hp =new HighP(p1);RichP rp=new RichP(hp);rp.desc();//高富HRP hrusa =new HRP(p1);hrusa.desc();}}
abstract class Person{//公共基类,含有公共方法String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void desc();}
//主体类:中国人,美国人两个类
class Chinese extends Person{@Overridepublic void desc() {// TODO Auto-generated method stubSystem.out.println(name+"是中国人");}}
class USA extends Person{@Overridepublic void desc() {// TODO Auto-generated method stubSystem.out.println(name+"是美国人");}}
abstract class DPerson extends Person{Person person;//依据和的方式来支持多态的变化public DPerson(Person person){this.person=person;}
}
//扩展操作,对各国人进行操作
//组合代替继承
//基类代替子类消除编译时的依赖
class HighP extends DPerson{public HighP(Person person) {super(person);this.person=person;}public void desc() {super.person.desc();System.out.println("高");}
}
class RichP extends DPerson{public RichP(Person person) {super(person);this.person=person;}public void desc() {super.person.desc();System.out.println("富");}
}
class HRP extends DPerson{Person person;public HRP(Person person) {super(person);this.person=person;}public void desc() {super.person.desc();System.out.println("高富");}
}

扩展操作:

class HSP extends DPerson{Person person;public HSP(Person person) {super(person);this.person=person;}public void desc() {super.person.desc();System.out.println("帅");}
}

装饰模式框架:

package org.zangyu.Decorator;public class Decorator4 {public static void main(String[] args) {// TODO Auto-generated method stubCComponent c =new CComponent();CDecoratorA d1 =new CDecoratorA();CDecoratorB d2 =new CDecoratorB();d1.SetComponent(c);d2.SetComponent(d1);d2.Operation();}}
abstract class Component{public abstract void Operation();
}
class CComponent extends Component{@Overridepublic void Operation() {// TODO Auto-generated method stubSystem.out.println("具体对象操作");}}
//装饰类class Decorator extends Component{protected Component component;//组合抽象类public void SetComponent(Component component) {//设置抽象类this.component=component;}@Overridepublic void Operation() {// TODO Auto-generated method stub//重写继承的方法if(component!=null){//实际执行的方法component.Operation();}}
}//具体装饰类class CDecoratorA extends Decorator{private String addedState;//本类的独有的功能,区别于别的装饰类public void Operation() {//这个操作是抽象类Decorator中定义的方法super.Operation();//首先运行原Decorator的方法在执行本类的特有属性System.out.println("具体抽象类A的操作");}}class CDecoratorB extends Decorator{private String addedState;//本类的独有的功能,区别于别的装饰类public void Operation() {//这个操作是抽象类Decorator中定义的方法super.Operation();//首先运行原Decorator的方法在执行本类的特有属性System.out.println("具体抽象类B的操作");}private void CDB(){System.out.println("具体装饰类B的独有方法");}}

装饰模式的应用

  1. 何时使用

    在不想增加很多子类的情况下扩展类时

  2. 方法

    将具体功能职责划分,同时继承装饰者模式
    

.

  1. 优点

    装饰类和被装饰类可以独立发展,而不会相互耦合。它有效地把类的核心职责和装饰功能分开了
    装饰模式是继承关系的一个替代方案
    装饰模式可以动态地扩展一个实现类的功能
    
  1. 缺点

       多层装饰比较复杂。比如我们现在有很多层装饰,出了问题,一层一层检查,最后发现是最里层的装饰出问题了,想想工作量都害怕
    
  1. 使用场景

     需要扩展一个类的功能时需要动态地给一个对象增加功能,并可以动态地撤销时需要为一批的兄弟类进行改装或加装功能时
    

以上部分摘取自朱红梅老师2020年5月的课件。

设计模式 —— 装饰模式相关推荐

  1. 设计模式----装饰模式

    设计模式--装饰模式 "装饰模式(Decorator)"又名"包装模式(Wrapper)",通常用来灵活地扩充对象的功能. 在此之前我们可以通过类的继承来扩充父 ...

  2. 大话设计模式-装饰模式(大鸟和小菜Java版)

    装饰模式:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.(百度百科) 这个模式让后期的修改变得极为简单,真的就高内 ...

  3. 大话设计模式—装饰模式

    装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原 ...

  4. 设计模式--装饰模式

    目录 什么是装饰模式? 应用代码示例 装饰模式模板 jdk中的装饰模式 为什么装饰器类不能直接实现Component父类? 什么是装饰模式? 以生活中的场景来举例,一个蛋糕胚,给它涂上奶油就变成了奶油 ...

  5. C++设计模式-装饰模式

    目录 基本概念 代码和实例 基本概念 装饰模式是为已有功能动态地添加更多功能的一种方式. 当系统需要新功能的时候,是向旧系统的类中添加新代码.这些新代码通常装饰了原有类的核心职责或主要行为. 装饰模式 ...

  6. 李建忠设计模式——装饰模式

    1."单一职责"模式 在软件组件的设计中,如果责任划分不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式 Deco ...

  7. C++设计模式——装饰模式(高屋建瓴)

    原网址:https://blog.csdn.net/CoderAldrich/article/details/83115394 重点在于 ConcreteDecoratorA(Component *d ...

  8. java设计模式——装饰模式

    装饰模式也称为包装模式.结构型设计模式之一,其使用一种对客户端透明的方式动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一. 装饰模式可以动态的给一个对象添加一些额外的职责.就增加功能功能来说 ...

  9. 设计模式——装饰模式详解

    0. 前言   写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇 ...

  10. 设计模式 | 装饰模式

    1 | 装饰模式的概述 我们在了解装饰模式之前,先回顾下生活中的几个常见现象,举例如下: 新房的装修,房屋装修并没有改变房屋居住的本质,但可以让房屋变得更漂亮,更温馨,更实用,更满足居家需求. 相片的 ...

最新文章

  1. 使用Bot Service创建Bot Framework
  2. 无意间发现的一个留学mba的论坛
  3. 容器化部署实践之Django应用部署(二)
  4. android 自定义view文字不齐,Android 解决TextView排版参差不齐的问题
  5. 从C语言的角度重构数据结构系列(十二)-C语言判断语法详解(ifswitch)
  6. 军队计算机技术职称考试 类别,军队人员参加计算机考试科目设置和报考规定...
  7. mysql 备份脚本
  8. vfp 调用接口取数据_2分钟教你调用全国天气预报数据接口
  9. Zabbix 优缺点分别有哪些?
  10. DOM的利用冒泡做的一个小程序
  11. java screenframe_一个关于JFrame的问题
  12. 常用的VBA代码参考
  13. java 释放锁_Java并发编程:锁的释放
  14. 安装 PS2017CC
  15. 关于最近网上谣言传的很凶的 “太吾绘卷” 游戏源代码的问题。
  16. python获取word页数_用程序获取word页码方法汇总
  17. BDLS协议重磅发布 — Sperax启动Bug Bounty计划
  18. 嵌入式和物联网有什么关系?一文教你搞明白。
  19. python的Gensim库如何使用
  20. horizon学习小结

热门文章

  1. “中国十大名校”之争,缘何让百度气急败坏封贴?
  2. Windows7 64位软件资源
  3. 微信开放平台开发第三方授权登陆:微信扫码登录
  4. 微信小程序怎么开通(自己申请开通微信小程序的方法)
  5. win10打字反应慢处理
  6. 如何实现视频平台会员多账号登录
  7. 文本编辑器Geany
  8. 骨传导耳机品牌排行榜前十名,目前最好的几款骨传导耳机推荐
  9. 计算机打不开网络共享,电脑的网络和共享中心打不开,网络发现又没打开,..._网络编辑_帮考网...
  10. Smartphone--Android真机管理平台