Head First Design Patten装饰者模式

开放-关闭原则

类应该对扩展开放,对修改关闭:当类中需要加入新功能时,可以考虑扩展新的类,而不是修改原有的类。

认识装饰者模式

1、拿一个咖啡为对象

2、以摩卡对象装饰它

3、以牛奶对象装饰它

4、调用cost方法,并依赖委托将调料价格加上

装饰者和被装饰对象有相同额超类型

你可以用一个或多个装饰者包装一个对象

装饰者可以在所委托被装饰者的行为之前或者之后,加上自己的行为,以达到特定的目的

对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象

装饰者模式动态的将责任或者特性附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案

public abstract class Beverage {
    String  description = "Unknow Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

public abstract class CondimentDecorator extends Beverage{
    public abstract String getDescription();
}

public class Espresso extends Beverage {
    public Espresso(){
        description = "Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}

public class HouseBlend extends Beverage {

    public  HouseBlend(){
        description = "House Blend Coffee";
    }

    @Override
    public double cost() {
        return 0.89;
    }
}

public class Mocha extends CondimentDecorator {
    Beverage beverage;

    public Mocha(Beverage beverage){
        this.beverage = beverage;
    }

    public String getDescription(){
        return beverage.getDescription()+",Mocha";
    }

    @Override
    public double cost() {
        return 0.20 + beverage.cost();
    }
}

public class StarbuzzCoffee {
    public static void main(String[] args){

        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $ "+beverage.cost());

        beverage = new Mocha(beverage);
        System.out.println(beverage.getDescription() + " $ "+beverage.cost());
    }
}
时间: 2024-08-06 20:08:14

Head First Design Patten装饰者模式的相关文章

Head First Design Pattern 读书笔记(3)装饰者模式

Head First Design Pattern 读书笔记(3) Decorator Pattern 装饰者模式 Decorator Pattern 类图 定义 装饰者模式:通过让组件类与装饰者类实现相同的接口,装饰类可以在不修改原有组件类的情况下,动态拓展组件类的新功能,并且可以无限拓展下去. 几个OO的原测 类应该对修改关闭,对拓展开放.–>"开闭原则",即尽量不要修改已经在用的类,而通过继承的方式去拓展类的新功能. 设计类时应当尽量考虑不修改原有的代码.–>同&qu

Design Pattern 设计模式 Decorator 装饰者模式

1 设计一个基类 2 继承这个基类,并包含这个基类的一个对象 3 创建继承类的时候,初始化这个基类,因为是基类指针,所以可以是所有基类的衍生类对象,那么就可以叠加任意多个衍生类对象了. 关键是在衍生类中包含一个基类对象,然后有了继承和包含两重关系,可以使得一个类一个类对象叠加,达到装饰目的. 等于是创建了一个对象指针链表,一个一个对象发挥其相应的作用. 下面程序装饰一个桌子,同时包含释放内存的处理. 关键要知道基类的析构函数必须使用虚函数,为什么? 1 如果基类不是析构函数,那么如果衍生类中包含

java_设计模式_装饰者模式_Decorator Pattern(2016-07-28)

装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同.装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展. 装饰模式的类图如下: 在装饰模式中的角色有: ● 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象. ● 具体构件(ConcreteComponent)角色

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用

装饰者模式(Decorator)

装饰者模式:就是用来装饰别的类的,可以理解成 加油添醋(或锦上添花····) 面条,可以是牛肉面.鸡蛋面.·····等等, 转换成java代码就是: 面条 --- 抽象类 Noodle; 牛肉面 ----  BeefNoodles; 瘦肉面  ---- MeatNoodles; ```````````这样就会有各种各样的面条的具体类了, 关键不是数量的问题,假如有一个 加鸡的牛肉面呢? 再新建一个 BeefAndEggNoodles? 那 加蛋加香肠的牛肉面呢··················

设计模式之装饰器模式

一.百科 概述: 23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点: (1) 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. (2) 装饰对象包含一个真实对象的引用(reference) (3) 装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象. (4) 装饰对象可以在转发这些请

设计模式06_装饰者模式

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51531519 1.定义 动态将职责添加到对象身上.若要扩展功能,装饰者模式提供了比继承更加灵活的替代方案.(摘自Head First 中文版第91页) 2.说明 通常情况下,在使用继承设计子类的行为,是在编译时静态决定的,所有的子类都会继承到相同的行为,这样会产生耦合较高.而利用组合来扩展对象的行为,就可以在运行时动态地进行扩展.装饰者模式是组合的一种表现

装饰者模式Decorator

装饰者模式: 动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案.      装饰者和被装饰者有相同的超类型. 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的. OO原则:多用组合,少用继承. 1.装饰者和被装饰者共同的基类 /*Beverage饮料*/class Beverage {public:    Beverage()    {        _description = "Unknow Beverage";    } v

适配器模式 vs 装饰者模式

Reference [1] https://refactoring.guru/design-patterns/adapter 1. Adaptor Design Pattern 适配器模式 Adapter is a structural design pattern, which allows incompatible objects to collaborate. You can create an adapter. This is a special object that converts