设计模式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 

    

   

原文地址:https://www.cnblogs.com/liaokailin/p/3799940.html