设计模式(七)——装饰模式

来源:互联网 发布:皮影客软件介绍 编辑:程序博客网 时间:2024/05/17 07:51

定义

<span style="font-family:Microsoft YaHei;font-size:14px;">Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality</span>

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比添加子类更加灵活。


类图



涉及四个角色:

  ★  Component抽象构件:

      一个接口或者抽象类,定义核心对象,也就是原始的对象。

  ★ ConcreteComponent具体构件

      最原始最基本接口或抽象类的具体实现,是要装饰的目标

  ★ Decorator装饰角色

     一般是一个抽象类,实现接口或者抽象方法,类中不一定有抽象方法,但是它属性中必须有一个private变量指向Component抽象构件。

  ★  具体装饰角色

    ConcreteComponentA和ConcreteComponentB是两个具体的装饰类。


实现



抽象构件

public abstract class Component {public abstract void operate();}

具体构件

public class ConcreteComponent extends Component {@Overridepublic void operate() {System.out.println("初始的实现类~要把我包装下哦~");}}

抽象装饰者

public abstract class Decorator extends Component {private Component component=null;//通过构造函数传递被修饰者public Decorator(Component component){this.component=component;}//委托给被修饰者执行@Overridepublic void operate() {this.component.operate();}}

具体装饰角色<只写一个>

public class ConcreteDecorator1 extends Decorator {//定义被修饰者public ConcreteDecorator1(Component component) {super(component);}//定义包装方法private void decoratorMethod1(){System.out.println("包装类的第一次包装~");}//重写父类的Operate方法public void operate(){this.decoratorMethod1();super.operate();}}

场景类

public class Client {public static void main(String[] args) {//定义要装饰的原始类Component component = new ConcreteComponent();//第一次修饰component = new ConcreteDecorator1(component);//第二次修饰component = new ConcreteDecorator2(component);component.operate();}}

输出

包装类的第一次包装~初始的实现类~要把我包装下哦~包装完整~

优缺点:

优点:

  •  装饰类和被装饰类可以独立发展,换句话说,Component类无须知道Decorator类,Decorator类是从外部来扩展Component类的功能,而Decorator类也不用知道具体构件。
  • 装饰模式是继承关系的一个替代方案,不管装饰多少层,返回的对象仍然是Component,实现的还是is-a关系。
  • 可以动态的扩展一个类的功能。

缺点:

       多层装饰比较复杂,装饰类多时系统复杂度较高,不容易发现问题所在。


应用场景:

需要扩展类的功能,或给类增加一个附加功能;

需要动态地给一个对象增加功能,这些功能可以撤销;


装饰模式动态扩展性非常强,比如有三个继承关系的类:Father、Son、GrandSon,如果要在Son类上增加功能,这时如果修改Son的方法那个对其子类GrandSon影响非常大,这时就可以建立SonDecorator类来修饰Son,相当于建立了新类,但是对原有的程序没有特别大的影响,很好的完成了扩展。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑文件夹怎么设密码忘记了怎么办 苹果手机id有分机和主机怎么办 绝地求生号被盗了邮箱被改了怎么办 微信邮箱怎么接收不到验证码怎么办 要申请一个特定的qq邮箱号怎么办 中银e贷额度为0怎么办 中银e贷被冻结了怎么办 中国银行e贷款填错了被拒怎么办 中银e贷逾期2天怎么办 大学生助学贷款网站密码忘了怎么办 乳晕毛囊挤压捏起来有小硬节怎么办 手机版模拟人生孕妇任务卡死怎么办 百度网盘的表格没保存怎么办 爱奇艺买的会员不小心删了怎么办 多次举报和拉黑克隆不了好友怎么办 货车把货拉到货主不付钱怎么办 中国银行网银公司用户名忘了怎么办 伟星管网站查不到电水管图纸怎么办 我的耕地己确权被他人侵权怎么办 掌上川电登录密码忘记了怎么办 华为商城不小心点了确认收货怎么办 买的认证服务号没有微信支付怎么办 手机微信里的外网链接打不开怎么办 微信违规无法加入群聊怎么办 苹果手机微信储存空间不足怎么办 拼多多砍价砍不到0元怎么办 妻子婚内出轨我的熟人怎么办 父亲怀疑母亲有外遇作为儿子怎么办 老婆出轨我总心理过不去坎该怎么办 失业人员离培训机构远了怎么办 遇到申请假冒商品的仅退款怎么办 微信被骗什么消息都不知道怎么办 微信用手机登录显示未注册怎么办 唯品会海淘订单取消不了怎么办 大排量摩托芯片钥匙断了怎么办 夏天太热在宿舍没空调怎么办? 汽车钥匙掉了怎么办半路到不了家 当顾客说产品太贵的时候 怎么办 邮件还没有下载被发送者删除怎么办 绝地求生号被盗了怎么办邮箱没有用 暴雪忘了密码换了手机号怎么办