美文网首页
java - 装饰者模式

java - 装饰者模式

作者: 徘徊0_ | 来源:发表于2018-04-09 10:20 被阅读0次

装饰者模式

装饰者模式:动态将责任添加到对象上。如果需要扩展功能,装饰者提供了比继承更有弹性的解决方案。装饰者模式类图如下:


装饰者模式类图(来源Head First).png

举个栗子:
情景如下:去饭店点菜的例子,饭店(Component),中国饭店(ConcreteComponent),菜品(Decorate),鱼(FishDecorate装饰者),牛排(SteakDecorate装饰者)

  • 被装饰者
    1,创建基类
/**
 * 饭店
 * @author cuishuxiang
 */
public abstract class Restaurant {
    //点菜
    String orderFood="Order Nothing";
    
    public String getOrderFoods() {
        return orderFood;
    }
    
    //根据点的菜,计算价格
    abstract int cost();
}

2,创建饭店的具体实现类

/**
 * 中国餐馆
 * @author cuishuxiang
 */
public class ChinaRestaurant extends Restaurant{
    
    public ChinaRestaurant() {
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public String getOrderFoods() {
        // TODO Auto-generated method stub
        return super.getOrderFoods();
    }

    @Override
    int cost() {
        // 此时没点菜,价格为 0 
        return 0;
    }

}
  • 装饰者(继承基类拥有同一个父类Restaurant
    1,创建装饰者基类
/**
 * 抽象装饰者
 * @author cuishuxiang
 *
 */
public abstract class Decorate extends Restaurant{

  public abstract String getOrderFoods();//点了什么菜
  
}

2,鱼(具体的装饰者)

/**
 * 点了鱼
 * @author cuishuxiang
 *
 */
public class FishDecorate extends Decorate{
    private Restaurant restaurant;
    
    public FishDecorate(Restaurant restaurant) {
        // 这里持有 Restaurant 的引用
        this.restaurant=restaurant;
    }

    @Override
    int cost() {
        // 此时应先计算上个的价格 再加上 鱼的价格
        return restaurant.cost()+10;
    }

    @Override
    public String getOrderFoods() {
        // TODO Auto-generated method stub
        return " 点了China饭店的 鱼!";
    }

}

3,牛排(具体的装饰者)

/**
 * 牛排
 * 
 * @author cuishuxiang
 *
 */
public class SteakDecorate extends Restaurant{
    Restaurant restaurant;
    
    public SteakDecorate(Restaurant restaurant) {
        this.restaurant=restaurant;
    }
    
    @Override
    public String getOrderFoods() {
        return restaurant.getOrderFoods()+",点了饭店的牛排。";
    }
    @Override
    int cost() {
        return restaurant.cost()+20;
    }

}
  • 测试
/**
 * 测试类
 * @author cuishuxiang
 */
public class RestaurantTest {

    public static void main(String[] args) {
        Restaurant restaurant=new ChinaRestaurant();
        
        //装饰者,点了鱼(将引用传入)
        restaurant=new FishDecorate(restaurant);
        //装饰者,点了牛排
        restaurant=new SteakDecorate(restaurant);
            
        System.out.println("点的菜:"+restaurant.getOrderFoods());
                
        System.out.println("总价为: "+restaurant.cost());
    }
}

结果为:


装饰者测试结果.png 调用逻辑如上图.png
总结
  • 装饰者模式特点
    1,装饰者与被装饰者拥有相同的父类(如上例中的Restaurant)。
    2,装饰者中都持有一个被装饰者的引用(如上例中构造器需要传入一个Restaurant引用)。
    3,装饰者执行完自己的逻辑之后,会将最终的结果传递给被装饰者(在装饰者类当中调用被装饰者类的方法,封装成新的功能方法。)。
    4,扩展性比较好,灵活性高。但是响应的会出现比较多的类。
    5,java中最常见的就是I/O,使用的就是装饰者模式。

相关文章

  • java IO 的知识总结

    装饰者模式 因为java的IO是基于装饰者模式设计的,所以要了解掌握IO 必须要先清楚什么事装饰者模式(装饰者模式...

  • 设计模式 | 装饰者模式及典型应用

    前言 本文的主要内容: 介绍装饰者模式 示例 源码分析装饰者模式的典型应用Java I/O 中的装饰者模式spri...

  • 再谈装饰者模式(总结)

    在之前的文章 浅谈装饰者模式+JAVA I/O中的装饰者模式 中,浅谈了一下装饰者模式,这篇文章来总结一下装饰者模...

  • Android里一个装饰者模式的应用场景——给RecyclerV

    Java中最常见的装饰者模式应用就是IO流的设计了。先简单回顾一下装饰者模式: 装饰者模式的思想就是在被包装者原有...

  • 装饰者模式——IO流运用

    推荐博客Java设计模式学习09Java设计模式学习09Java设计模式学习09 装饰者模式还是比较难懂的。。。。...

  • Java设计模式之 —— 装饰者(Decorator) — 点

    Java设计模式之 —— 装饰者(Decorator) — 点炒饭 下面会用做炒饭的例子来描述一下装饰者设计模式,...

  • java中的代理模式与装饰者模式的区别

    java中的代理模式与装饰者模式的区别 代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都...

  • java - 装饰者模式

    装饰者模式 装饰者模式:动态将责任添加到对象上。如果需要扩展功能,装饰者提供了比继承更有弹性的解决方案。装饰者模式...

  • Java装饰者模式

    1、装饰者模式的定义 装饰者模式是在已有功能的基础之上,动态地添加更多功能的一种方式,这些新加的代码装饰了原有类的...

  • java装饰者模式

    java中增强方法的功能有三种方式 1.通过继承,重写父类的方法,在调用super的基础上,再添加代码 2.动态代...

网友评论

      本文标题:java - 装饰者模式

      本文链接:https://www.haomeiwen.com/subject/onlmhftx.html