设计模式(二)之装饰器模式

定义一个代表被装饰事物的接口:

public interface Coffee {

    public String getCoffer();

    public double getPrice();
}

最初的具体事物:

public class Starbucks implements Coffee {

    @Override
    public String getCoffer() {
        return "星巴克";
    }

    @Override
    public double getPrice() {

        return 10D;
    }

}

被装饰后的具体事物:

public class Seasoning implements Coffee {

    private Coffee coffee;

    public Seasoning(Coffee coffee) {
        this.coffee = coffee;
    }

    @Override
    public String getCoffer() {
        return coffee.getCoffer();
    }

    @Override
    public double getPrice() {
        return coffee.getPrice();
    }
}

一号装饰器:

public class SeasoningOne extends Seasoning implements Coffee {

    public SeasoningOne(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getCoffer() {
        return super.getCoffer() + " 糖";
    }

    @Override
    public double getPrice() {
        return super.getPrice() + 1.0D;
    }

}

二号装饰器:

public class SeasoningTwo extends Seasoning implements Coffee {

    public SeasoningTwo(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getCoffer() {
        return super.getCoffer() + " 牛奶";
    }

    @Override
    public double getPrice() {
        return super.getPrice() + 5.0D;
    }
}

三号装饰器:

public class SeasoningThree extends Seasoning implements Coffee {

    public SeasoningThree(Coffee coffee) {
        super(coffee);
    }
    @Override
    public String getCoffer() {
        return super.getCoffer() + " 摩卡";
    }

    @Override
    public double getPrice() {
        return super.getPrice() + 3.0D;
    }
}

使用者:

public class Consumer {

    public static void main(String[] args) {
        Coffee coffee = new SeasoningOne(new Seasoning(new Starbucks()));

        System.out.println(coffee.getCoffer() + ":" + coffee.getPrice());

        coffee = new SeasoningTwo(new SeasoningOne(new Seasoning(
                new Starbucks())));

        System.out.println(coffee.getCoffer() + ":" + coffee.getPrice());
        coffee = new SeasoningThree(new SeasoningTwo(new SeasoningOne(
                new Seasoning(new Starbucks()))));

        System.out.println(coffee.getCoffer() + ":" + coffee.getPrice());

    }
}
时间: 2024-11-13 08:56:27

设计模式(二)之装饰器模式的相关文章

实例讲解Ruby使用设计模式中的装饰器模式的方法_ruby专题

概述       若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一  个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类-这建立在额外的代码上.       通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只

深入解析设计模式中的装饰器模式在iOS应用开发中的实现_IOS

装饰器模式可以在不修改代码的情况下灵活的为一对象添加行为和职责.当你要修改一个被其它类包含的类的行为时,它可以代替子类化方法. 一.基本实现下面我把类的结构图向大家展示如下: 让我们简单分析一下上面的结构图,Component是定义一个对象接口,可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知

php设计模式介绍之装饰器模式

若你从事过面向对象的php开发,即使很短的时间或者仅仅通过本书了解了一些,你会知道,你可以 通过继承改变或者增加一个类的功能,这是所有面向对象语言的一个基本特性.如果已经存在的一个php 类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类 -这建立在额外的代码上. 但是产生子类并不总是可能或是合适的.如果 你希望改变一 个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只能在于 运行时完成,后者显然时可能的,但是可能会导致

学习php设计模式 php实现装饰器模式(decorator)_php技巧

动态的给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活[GOF95] 装饰模式是以对客户透明的方式动态地给一个对象附加上更多的职责.这也就是说,客户端并不会觉得对象在装饰前和装饰后有什么不同.装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展.一.装饰模式结构图   二.装饰模式中主要角色抽象构件(Component)角色:定义一个对象接口,以规范准备接收附加职责的对象,从而可以给这些对象动态地添加职责.具体构件(Concrete Compon

java设计模式系列之装饰者模式_java

何为装饰者模式 (Decorator)? 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活.一.结构 Component : 定义一个对象接口,可以给这些对象动态地添加职责. interface Component { public void operation(); } ConcreteComponent : 实现 Component 定义的接口. class ConcreteComponent implements Component { @O

PHP设计模式之装饰器模式

装饰器设计模式适用于下列工作场合: 需求变化是快速和细小的,而且几乎不影响应用程序的其他部分.() 使用装饰器设计模式设计类的目标是: 不必重写任何已有的功能性代码,而是对某个基于对象应用增量变化. 装饰器设计模式采用这样的构建方式: 在主代码流中应该能够直接插入一个或多个更改或"装饰"目标对象的装饰器,同时不影响其他代码流. <?php        class CD {            public $trackList;                        

设计模式(八)装饰器模式Decorator(结构型)

1. 概述        若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类-这建立在额外的代码上.       通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个

PHP设计模式——装饰器模式

声明:本系列博客参考资料<大话设计模式>,作者程杰.         装饰器模式又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.         UML类图:                  角色:        组件对象的接口:可以给这些对象动态的添加职责        所有装饰器的父类:需要定义一个与组件接口一致的接口,并持有一个Component对象,该对象其实就是被装饰的对象.      

PHP设计模式装饰器模式实例

我们在使用面向对象的日常开发过程中,或许会碰见需要对某个方法或者某个对象,添加新的行为.然而常见的做法是,写一个子类继承需要改写的类,然后去重新实现类的方法. 但是装饰器模式(Decorator),可以动态地添加修改类的功能,在使用装饰器模式,仅需在运行时添加一个装饰器对象既可实现,相对与生成子类更加的灵活. 在我们需要改写一个类的时候通常的做法是采用继承的方式来重新方法,如下代码 /*  * 比如我们需要改写一串字符串的样式,采用继承的写法.  */ class Canvas {     fu