码迷,mamicode.com
首页 > 其他好文 > 详细

装饰者模式

时间:2019-05-06 01:11:32      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:简单   width   orm   NPU   public   desc   管道   bsp   创建   

装饰者模式:

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

  关键:  装饰者和被装饰者都继承同一个对象,  装饰者继承并不是为了获得父类地行为, 而是达到类型匹配地目的

  通常装饰者模式采用抽象类

技术图片

java中的装饰类: I/O 

  Component--->InputStream

  ConcreteComponent---->FileInputStream, StringBufferInputStream, ByteArrayInputStream..

  Decorator----> FilterInputStream;

  Concrete--->BufferedInputStream...是不是觉得一下子恍然大悟了, 之前一直用输入流的时候套管道--.--;

 

Example:  想象一下, 一家咖啡店, 咖啡里面可以加各种不同地调料, 你要去计算每一种不同搭配的饮料的价格, 怎么办

  1. 简单的继承想法: 先创建一个抽象的Bevarage(饮料)基类, 把计算价格的方法都定义成抽象的, 所有具体的咖啡都继承这个父类, 然后实现自己的几个计算

   如果这么做,我们来考虑几个问题, 1) 首先调料之间就有非常多的组合, 难道你要每一种组合都去实现它的具体类吗, 2) 就算你毅力惊人实现了所有类, 那么要            价格变了, 打折了, 新添加了一种调料, 难道又要重写吗, 显然继承有点难以为继

  所以我们想, 你的咖啡里加了什么调料, 我们可以动态地把价格加上去多好

下面就是一个简单利用装饰模式, 实现动态地计算咖啡价格地例子:

  1) 一个抽象Beverage基类, 含有一个计算cost的抽象方法;

  

public abstract class Bevarage {

    String description;
    public String getDescription() {
        return description;
    }
    
    abstract double cost();

}

 

  2) 普通coffe类和抽象Condiments类都继承Bevarage类, 同时装饰者中含有一个Bevarage对象---->实现装饰模式的关键;

  

public class Coffe extends Bevarage {

    public Coffe() {
        this.description = "Normal Coffe";
    }
    @Override
    double cost() {
        return 5.1;
    }
}

/*不知道这个beverage放在者还是子类里比较好*/
public abstract class CodimentsDecorator extends Bevarage {
    Bevarage bevarage;
}

public class Milk extends CodimentsDecorator {

    public Milk(Bevarage b) {
        this.bevarage = b;
    }
    public String getDescription() {
        return bevarage.getDescription() + ", Milk";
    }
    
    @Override
    double cost() {
        return 0.5 + bevarage.cost();
    }
}

public class Mocha extends CodimentsDecorator {

    public Mocha(Bevarage b) {
        this.bevarage = b;
    }

    @Override
    public String getDescription() {
        return bevarage.getDescription() + ", Mocha";
    }

    @Override
    double cost() {
        return 1.2 + bevarage.cost();
    }
}

public class Test {
    public static void main(String[] args) {
        /*点一杯基本的咖啡, 然后加进去各种调料*/
        Bevarage b = new Coffe();
        Bevarage milk = new Milk(b);
        Bevarage mocha = new Mocha(milk);

        double cost = mocha.cost();
        System.out.println(mocha.getDescription() + "\ncost " + cost);
    }
}

输出: Normal Coffe, Milk, Mocha
        cost 6.8

装饰者模式

标签:简单   width   orm   NPU   public   desc   管道   bsp   创建   

原文地址:https://www.cnblogs.com/noino/p/10817330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!