设计模式10-装饰模式

1. 概念

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活

2. 案例

/**********************************************************************
 * <pre>
 * FILE : Demo01.java
 * CLASS : Demo01
 *
 * AUTHOR : Liaokailin
 *
 * FUNCTION : TODO
 *
 *
 *======================================================================
 * CHANGE HISTORY LOG
 *----------------------------------------------------------------------
 * MOD. NO.|   DATE   |   NAME  | REASON  | CHANGE REQ.
 *----------------------------------------------------------------------
 *             |2014-3-6|Liaokailin| Created |
 * DESCRIPTION:
 * </pre>
 ***********************************************************************/
package org.demo.decorate.demo01;
/**
 * 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
 * 适用性
    1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
    2.处理那些可以撤消的职责。
    3.当不能采用生成子类的方法进行扩充时。

    参与者
    1.Component
    定义一个对象接口,可以给这些对象动态地添加职责。
    2.ConcreteComponent
    定义一个对象,可以给这个对象添加一些职责。
    3.Decorator
    维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
    4.ConcreteDecorator
    向组件添加职责。
 */

//component
interface Person{
    void eat() ;
}

//ConcreteComponent 

class Man implements Person{
    @Override
    public void eat() {
        System.out.println("Man: eat");
    }
}
//Decorate
abstract class Decorator implements Person{
    protected Person person ;
    public void setPerson(Person person){
        this.person = person ;
    }
    public void eat(){
        person.eat() ;
    }
}
//ConcreteDecorate

class ConcreteDecorate extends Decorator{
    public void eat(){
        System.out.println("wash before each meal");
        super.eat() ;
        System.out.println("wipe mouth");
    }
}

public class Demo01 {
   public static void main(String[] args) {
    Man m = new Man() ;
    ConcreteDecorate c = new ConcreteDecorate() ;
    c.setPerson(m) ; //装饰man
    c.eat() ;
}
}

运行结果:

wash before each meal
Man: eat
wipe mouth

3. 案例二

/**********************************************************************
 * <pre>
 * FILE : Demo02.java
 * CLASS : Demo02
 *
 * AUTHOR : Liaokailin
 *
 * FUNCTION : TODO
 *
 *
 *======================================================================
 * CHANGE HISTORY LOG
 *----------------------------------------------------------------------
 * MOD. NO.|   DATE   |   NAME  | REASON  | CHANGE REQ.
 *----------------------------------------------------------------------
 *             |2014-3-6|Liaokailin| Created |
 * DESCRIPTION:
 * </pre>
 ***********************************************************************/
package org.demo.decorate.demo02;

interface DrinkComponent{
    float getTotalCost() ;
    String getDescription() ;
}

class Espresso implements DrinkComponent{
    private String description = "Espresso" ;
    private float cost = 0.75f  ;
    public float getTotalCost() {
        return cost;
    }
    public String getDescription() {
        return description;
    }
}

class EspressoConPanna implements DrinkComponent {
      private String description = "EspressoConPare";
      private float cost = 1;
      public float getTotalCost() {
        return cost;
      }
      public String getDescription() {
        return description;
      }
    }

abstract class Decorator implements DrinkComponent{
    protected DrinkComponent component ;
    public Decorator(DrinkComponent component){
        this.component = component ;
    }
    @Override
    public float getTotalCost(){
        return component.getTotalCost() ;
    }

     public String getDescription() {
            return component.getDescription();
      }
}

class ExtraEspresso extends Decorator{
    private float cost = 1f ;
    public ExtraEspresso(DrinkComponent component){
        super(component) ;
    }
    @Override
    public float getTotalCost() {
        return super.getTotalCost()+cost;
    }

    @Override
    public String getDescription() {
        return super.getDescription() +"extra espresso";
    }

}
public class Demo02 {
   public static void main(String[] args) {
       Espresso espresso = new Espresso() ; //DrinkComponent ;
       ExtraEspresso decorate = new ExtraEspresso(espresso) ;
       System.out.println("coffer:"+decorate.getDescription()+";totalCost:"+decorate.getTotalCost() );

}
}

执行结果:

coffer:Espressoextra espresso;totalCost:1.75

4. 案例三

/**********************************************************************
 * <pre>
 * FILE : Demo03.java
 * CLASS : Demo03
 *
 * AUTHOR : Liaokailin
 *
 * FUNCTION : TODO
 *
 *
 *======================================================================
 * CHANGE HISTORY LOG
 *----------------------------------------------------------------------
 * MOD. NO.|   DATE   |   NAME  | REASON  | CHANGE REQ.
 *----------------------------------------------------------------------
 *             |2014-3-6|Liaokailin| Created |
 * DESCRIPTION:
 * </pre>
 ***********************************************************************/
package org.demo.decorate.demo03;
/**
 * 写一个简单的系统,
 * 用decorator模式模拟以下情况:
 * 有些鸟会飞而有一些不会,
 * 有一些鸟会游泳而有一些不会,
 * 还有一些既会飞又会游泳。
 *
 * 分析  如果写一个bird类 然后继承生成各种bird  这显然不合理的  bird太多  导致子类过多 。
 * 但是为了给bird增加一些功能  如: fly swim
 */

interface Bird{
    void type() ; //类型
}

class Bird01 implements Bird{
    public void type() {
        System.out.print(" a bird :");
    }
}

abstract class Decorator implements Bird{
    protected Bird bird ;
    public Decorator(Bird bird){
        this.bird = bird ;
    }

    public void type(){
        bird.type() ;
    }
}

class Decorator01 extends Decorator{

    public Decorator01(Bird bird) {
        super(bird);
    }
    @Override
    public void type() {
        super.type();
        System.out.println(" only can fly ");
    }
} 

class Decorator02 extends Decorator{

    public Decorator02(Bird bird) {
        super(bird);
    }
    @Override
    public void type() {
        super.type();
        System.out.println(" only can swim ");
    }
} 

class Decorator03 extends Decorator{

    public Decorator03(Bird bird) {
        super(bird);
    }
    @Override
    public void type() {
        super.type();
        System.out.println(" not only fly,but also swim ");
    }
} 

public class Demo03 {
    public static void main(String[] args) {
        Bird b = new Bird01() ;
        Decorator d1 = new Decorator03(b) ;
        d1.type();
    }
}

执行结果:

 a bird : not only fly,but also swim 

设计模式10-装饰模式,布布扣,bubuko.com

时间: 2024-12-25 19:27:18

设计模式10-装饰模式的相关文章

设计模式-10 装饰模式(结构型模式)

一 装饰模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 主要解决:扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀. 关键代码:1.Component 类充当抽象角色,不应该具体实现. 2.修饰类引用和继承 Component 类,具

设计模式之装饰模式20170726

结构型设计模式之装饰模式: 一.含义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 通俗来讲,装饰模式是对类的功能进行加强或减弱. 二.代码说明 1.主要有两个角色 1)构件 最核心.最原始.最基本的对象,也就是要装饰的对象. 2)装饰角色 把最核心.最原始.最基本的东西装饰成其他东西 2.在用C实现过程中也是参考这种思想,以修饰成绩单举例,具体实现如下: 1)装饰模式使用场景: 1 /***********************************

学习大话设计模式06_装饰模式

装饰模式(Decorator): 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 1 /** 2 * Component 是定义一个对象接口,可以给这些对象动态地添加职责 3 * @author Monica 4 * 5 */ 6 public abstract class Component { 7 public abstract void Operation(); 8 } 9 10 11 /** 12 * ConcreteComponent 是定义了一个具体

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

跟我学设计模式视频教程——装饰模式,装饰模式VS代理模式

课程视频 装饰模式 装饰模式VS代理模式1 装饰模式VS代理模式2 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--装饰模式,装饰模式VS代理模式,布布扣,bubuko.com

设计模式之装饰模式 c++实现和详细分析

Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 它使功能具有动态性 已经开发完毕的对象,后期由于业务需要,对旧的对象需要扩展特别多的功能,这时候使用给对象动态地添加新的状态或者行为(即装饰模式)方法,而不是使用子类静态继承. 引入装饰模式的原因  : 由于若有很多个功能,这么多功能 可能会出现各种组合,而每个组合都要对应一个类,这是指数级的类的数量增长(因为我们要扩展不应直接修改类,所以采取继承 而不是改变原有类)  

【设计模式】——装饰模式

装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 装饰模式结构图: Component是定义一个对象接口,可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的.至于ConcreteDecorator就是具体

大话设计模式_装饰模式(Java代码)

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 简单描述:1一个父类A(主要给各具体装饰者可以设置待装饰对象),1个具体待装饰类(继承于父类A),1个抽象装饰者(继承父类A),多个具体装饰者(继承抽象装饰者).装饰者持有父类A的引用,每个装饰者在调用方法时都先调用持有的引用的对应方法,另外可在方法中再添加自己的功能(貌似描述得比较复杂,其实就是一传一,每个中间者都可以添加自身的功能) 大话设计模式中的截图: Component是定义一个对象接口,可以给

设计模式笔记——装饰模式

装饰模式 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 1.装饰模式的特点 (1)装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. (2)装饰对象包含一个真实对象的引用(reference) (3)装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象. (4)装饰对象可以在转发这些请求以前或以后增加一些附加功能.这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功