设计模式——装饰器模式

介绍

向一个现有对象添加新功能,而又不改变原结构。

意图

动态的给一个对象添加一些额外的职责。

解决

一般的,为了扩展类常常使用继承去实现,由于继承为类进入静态特征,并且随着功能的增多,子类会很膨胀。

优点

  1. 装饰类与被装饰类可以独立发展,不会相互耦合;
  2. 装饰模式是继承的一个替代模式,可以动态扩展一个实现类的功能。

缺点

  1. 多层装饰比较复杂。

使用场景

  1. 扩展类的功能;
  2. 动态增加功能,动态撤销。

UML

示例

House.java

package cn.geoaryblog.design.cretedg.decorator;

public interface House {
    String desc();
}

NewHouse.java

package cn.geoaryblog.design.cretedg.decorator;

public class NewHouse implements House {
    @Override
    public String desc() {
        return "新房子,刚刚领到了钥匙,还是毛坯房";
    }
}

DecoratorHouse.java

package cn.geoaryblog.design.cretedg.decorator;

public class DecoratorHouse implements House {
    private NewHouse house;

    public DecoratorHouse(NewHouse house) {
        this.house = house;
    }

    @Override
    public String desc() {
        String oldHouse = house.desc();
        oldHouse += "\n开始装修\n";
        oldHouse += "铺地\n";
        oldHouse += "刷墙\n";
        oldHouse += "买家电\n";
        oldHouse += "完工\n";
        return oldHouse;
    }
}

Client.java

package cn.geoaryblog.design.cretedg.decorator;

public class Client {
    public static void main(String[] args) {
        House oldHouse = new NewHouse();
        House decoraHouse = new DecoratorHouse(oldHouse);
        System.out.println(oldHouse.desc());
        System.out.println(decoraHouse.desc());
    }
}

与代理模式的比较

  • 相同点:

装饰者与被装饰者都实现同一个接口;

代理类与真实类都实现同一个接口;

  • 不同点:

装饰器模式侧重于对原对象的扩展,即扩展后的对象仍然是对象本身(DecoratorHouse(NewHouse house), house为原对象);

代理模式则不会注重原对象,侧重于控制(ProxyTicketing(int userid), userid为后续需要校验的条件),客户端只需要直到代理类即可,具体的实现交由代理类去实现,将客户端与实现类解构。

一句话:代理模式:代理与真实对象之间的关系在编译时缺点;装饰器模式:在运行时被缺点。

posted @   Geoary  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示