设计模式总结2--装饰者模式

public interface Cake {

    public int cost();
}
<!-- 装饰蛋糕 -->
public abstract class CakeDecorator implements Cake{

}
public class AppleCake extends CakeDecorator{

    private Cake cake;
    public AppleCake(Cake cake) {
        this.cake = cake;
    }

    @Override
    public int cost() {
        System.out.println("送小蛋糕");
        return cake.cost() + 12;
    }

}
public class MilkCake implements Cake{

    @Override
    public int cost() {
        return 100;
    }

}

测试

public class Test {

    public static void main(String[] args) {

        MilkCake mc = new MilkCake();

        AppleCake ac = new AppleCake(mc);

        OrangeCake oc = new OrangeCake(ac);

        //OrangeCake oc = new OrangeCake(new AppleCake(new MilkCake()));

        System.out.println(oc.cost());

    }
}

===============================================================
===============================================================
<!-- 举例 -->
OutputStream
  ByteArrayOutputStream
  FileOutputStream
  PipedOutputStream
  FilterOutputStream
    BufferedOutputStream
    DataOutputStream

------------------------------------
装饰者模式
继承属于扩展形式之一,但不见得是弹性最好的最佳方式
在我们的设计中,应该允许行为可以被扩展,而无需修改现有的代
码(开闭原则)
除了继承,使用装饰者模式也可以让我们扩展行为
装饰者可以在被装饰者的行为前面、后面加上自己的行为,甚至可
以将被装饰者的行为取代,而达到特定的目的
装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程
序变得复杂

时间: 2024-11-13 07:54:36

设计模式总结2--装饰者模式的相关文章

设计模式C++实现——装饰者模式

模式定义: 装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 装饰者和被装饰者有相同的超累类型. 可以用一个或多个装饰者包装一个对象. 既然装饰者和被装饰者对象有相同的超累类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它. 装饰者可以委托被装饰者的行为之前与或之后,加上自己的行为,以达到特定的目的. 对象可以在任何时候被装饰,所以可以在运行时动态地.不限量地用你喜欢的装饰者来装饰对象. 模式结构: 举例: 购买咖啡时,可以在其中加入

设计模式篇——初探装饰器模式

文章目录 1.装饰器模式介绍 2.装饰器模式类图 3.装饰器模式Demo实现(一个小镇的拉面馆) 4.装饰器模式总结 装饰器模式介绍:装饰器模式可以在不修改任何底层代码的情况下,给对象赋予新的职责(程序运行时的扩展,动态的将责任附加到对象上).属于结构型设计模式. 类图: 我们来看下装饰器模式的类图: 一个简单的Demo(故乡小镇的一个面馆): 在故乡的一个小镇上面,有一家面馆,主营拉面.在这里你可以只点清汤面(SoupNoodle),也可以往里面加佐料,佐料有牛肉(Beef),鱼丸(FishB

javascript设计模式学习之——装饰者模式

一.装饰者模式定义 装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象.这种为对象动态添加职责的方式就称为装饰者模式.装饰者对象和它所装饰的对象拥有一致的接口,对于用户来说是透明的. 和java等语言不同的是,java的装饰器模式是给对象动态添加职责,javascript中,给对象添加职责的能力是与生俱来的,更侧重于给函数动态添加职责. 二.java中的装饰者模式实现 package com.bobo.shejimoshi.derector; public cl

【设计模式】之装饰器模式

为什么会有装饰模式? 装饰模式是为了解决继承强依赖性和出现大量子类不方便管理问题而出现的.   1. 概述 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活. 原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数.装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法.修饰类必须和原来的类有相同的接口. 2. 模式中的角色 2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态

设计模式之(Decorator)装饰者模式

1.需求 设计一个计算一块手机价格的程序,不同的存储容量(16GB和32GB)价格不同,不同的颜色(白色和黑色)价格不同,不同的网络制式(联通和电信)价格不同.当用户选定好配置后,程序计算其价格. 2.分析 考虑到未来存储容量可能升级到64GB,网络制式可能增加移动或者其他运营商,颜色可能增加更多的颜色,所以我们需要一种弹性的设计,可以自由添加存储容量,颜色和制式,同时程序不需要做太大改动.我们需要隔离程序可变部分和不可变部分,可变部分是配置,不可变部分是计算价格的过程,下面我们用装饰者模式来实

JAVA设计模式初探之装饰者模式

定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的. 要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为 实际上Java 的I/O API就是使用Decorator实现的. //定义被装饰

设计模式入门之装饰器模式Decorator

//装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Component:组件对象的接口.能够给这些对象动态加入职责 //ConcreateComponet:详细的组件对象.实现组件对象接口.通常就是被装饰器装饰的对象.也就是能够给这个对象加入职责 //Decorator:全部装饰器的抽象父类,须要定义一个与组件接口一致的接口,并持有一个Component对象,

设计模式三之装饰者模式1

装饰者模式,真是越来越生活化了,其实设计不就是源于生活高于生活吗?人类,一般总是把生活中观察的东西作为原料才能抽象出东西.装饰者模式,就是用各种装饰者对象来给被装饰者装饰,达到人们的多种多样的需求.不举咖啡的例子,实在没喝过几杯正式的咖啡.考虑炒饭,主要的原材料就是饭,但是变种非常多,近几天我就吃过和有深印象的,扬州炒饭.生牛肉炒饭.五香肉丁炒饭.XO酱海鲜炒饭.黄金炒饭.蛋炒饭等,像什么牛肉.葱花.肉丁.鸡蛋就是装饰者了,厨师用他们炒出(装饰出)各种饭.这种模式的优点是可以订制各种各样的需求,

[设计模式] javascript 之 装饰者模式

装饰者模式说明 说明:通一个类来动态的对另一个类的功能对象进行前或后的修饰,给它辅加一些额外的功能; 这是对一个类对象功能的装饰,装饰的类跟被装饰的类,要求拥有相同的访问接口方法(功能),这在动态面向对象类里,一般以实现同一个接口(interface)来约束实现:装饰类的要有对被装饰类的引用,用于在装饰类的相应方法,调用相应被装饰类的方法,然后对其进行修饰: 场景举例: 1>. 比如我们生活中的穿衣服, 一件衬衣,一件西装外套,一条裤子,一条领带,一双漂亮的皮鞋; 每多穿一件,都是对前面一件或全

设计模式整理_装饰者模式

装饰者模式将责任附加在对象上,若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 采用装饰者模式的时候,需要注意以下几点: 装饰者和被装饰者对象,有相同的超类型.(继承是为了有正确的类型,而不是继承行为,行为来自于被装饰者和基础的组件). 可以用一个或多个装饰者包装一个对象. 装饰者可以在所委托被装饰者的行为前或者行为后,增加自己的行为. 如果代码是依赖于具体的组件类型而不是针对抽象组件类型编程的时候,就会导致程序出现问题.因此应该具体类型具体分析. 装饰者模式体现了对于扩展开放和对于修改关