资讯专栏INFORMATION COLUMN

设计模式——装饰者模式

hoohack / 3003人阅读

摘要:装饰者模式遵循了开闭原则,对扩展开放,对修改关闭。但是在使用装饰者模式的同时可能会引入大量小类,而且使用装饰者模式除了实例化组件外,还要把组件包装进装饰者,会使代码显得不易理解。

1. 简介

  装饰者模式是一种结构型模式,它可以动态的将责任附加到对象上,在扩展功能方面,它比继承更有弹性。装饰者模式遵循了开闭原则,对扩展开放,对修改关闭。
  虽然在装饰者模式中也使用了继承,但是继承只是为了与被装饰者拥有共同的父类,达到类型匹配的目的,而不是为了获得父类的行为。因为装饰者与被装饰者拥有共同的父类,所以在任何需要原始对象的场合,都可以用装饰过的对象替代它。但是在使用装饰者模式的同时可能会引入大量小类,而且使用装饰者模式除了实例化组件外,还要把组件包装进装饰者,会使代码显得不易理解。

2. UML类图

  ConcreteComponent是具体组件,也就是被装饰者。Decorator是抽象装饰者,与ConcreteComponent拥有共同的超类Component————它是一个抽象组件,在具体装饰者ConcreteDecoratorA和ConcreteDecoratorB中有一个实例变量,可以记录被装饰的事物。

3. 实例

  去食堂吃饭,假如你想吃面条,食堂有牛肉面和热干面,还可以加青菜、煎蛋、香肠等配料,以后还可能增加更多的配料,在计算价格时需要根据不同的配料来计算,这里就可以用到装饰者模式。
抽象组件:

public abstract class Noodles {
    
    protected String desc;

    public String getDesc() {
        return desc;
    }
    
    public abstract double cost();
}

具体组件:

public class BeefNoodles extends Noodles {
    
    public BeefNoodles() {
        desc = "Beef Noodles.";
    }
    
    public double cost() {
        return 10.0;
    }    
}

public class HotDryNoodles extends Noodles {

    public HotDryNoodles() {
        desc = "Hot Dry Noodles.";
    }
    
    public double cost() {
        return 8.0;
    }
}

抽象装饰者:

//继承自Noodles,使装饰者与组件拥有共同的超类
public abstract class Condiment extends Noodles {
    
    public abstract String getDesc();

}

具体装饰者:

public class Vegetable extends Condiment {
    
    private Noodles noodles;
    
    public Vegetable(Noodles noodles) {
        this.noodles = noodles;
    }
    
    public String getDesc() {
        return noodles.getDesc() + ", vegetable";
    }
    
    public double cost() {
        return noodles.cost() + 2.0;
    }
}

public class Egg extends Condiment {
    
    private Noodles noodles;
    
    public Egg(Noodles noodles) {
        this.noodles = noodles;
    }
    
    public String getDesc() {
        return noodles.getDesc() + ", egg";
    }
    
    public double cost() {
        return noodles.cost() + 3.0;
    }
}

public class Sausage extends Condiment {
    
    private Noodles noodles;
    
    public Sausage(Noodles noodles) {
        this.noodles = noodles;
    }
     
    public String getDesc() {
        return noodles.getDesc() + ", Sausage";
    }
    
    public double cost() {
        return noodles.cost() + 4.0;
    }   
}

测试:

public class Test {
    
    public static void main(String[] args) {
        Noodles noodles = new BeefNoodles();
        System.out.println(noodles.getDesc() + ", " + noodles.cost());
        
        noodles = new Vegetable(noodles);
        noodles = new Egg(noodles);
        noodles = new Sausage(noodles);
        System.out.println(noodles.getDesc() + ", " + noodles.cost());
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71628.html

相关文章

  • Java 设计模式装饰模式

    摘要:装饰者模式组成结构抽象构件给出抽象接口或抽象类,以规范准备接收附加功能的对象。装饰者模式图解装饰者模式应用场景需要扩展一个类的功能,或给一个类添加附加职责。装饰者对象接受所有来自客户端的请求。参考资料设计模式 一、了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰者来包裹真实的对...

    kumfo 评论0 收藏0
  • 设计模式装饰模式

    摘要:相关设计模式装饰者模式和代理模式装饰者模式关注再一个对象上动态添加方法代理模式关注再对代理对象的控制访问,可以对客户隐藏被代理类的信息装饰着模式和适配器模式都叫包装模式关于新职责适配器也可以在转换时增加新的职责,但主要目的不在此。 0x01.定义与类型 定义:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的...

    chuyao 评论0 收藏0
  • 代理模式装饰模式

    摘要:简介代理模式和装饰者模式是两种常见的设计模式。这里通过构造函数的参数将被代理对象传入到代理中,也可以通过其它方式,如提供一个方法。下面是的代码输出首先依然是先创建一个需要被代理的对象,然后把它传入到的构造函数中。 简介 代理模式和装饰者模式是两种常见的设计模式。代理模式是为其它对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以...

    NusterCache 评论0 收藏0
  • 美颜相机中的设计模式 —— 装饰模式

    摘要:这是设计模式系列的第二篇,系列文章目录如下用一句话总结那些殊途同归的设计模式工厂策略模版方法美颜相机中的设计模式装饰者模式几乎所有的设计模式都是通过增加一层抽象来解决问题。 这是设计模式系列的第二篇,系列文章目录如下: 用一句话总结那些殊途同归的设计模式:工厂=?策略=?模版方法 美颜相机中的设计模式——装饰者模式 几乎所有的设计模式都是通过增加一层抽象来解决问题。 上一篇中提...

    anonymoussf 评论0 收藏0
  • JavaScript设计模式----装饰模式

    摘要:声明这个系列为阅读设计模式与开发实践曾探著一书的读书笔记装饰者模式的定义装饰者模式能够在不改变对象自身的基础上,在程序运行期间给对像动态的添加职责。与继承相比,装饰者是一种更轻便灵活的做法。装饰者模式的作用就是为对象动态的加入某些行为。 声明:这个系列为阅读《JavaScript设计模式与开发实践》 ----曾探@著一书的读书笔记 装饰者模式的定义: 装饰者(decorator)模式能...

    rose 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<