结构型模式-装饰器模式-Mybatis(CachingExecu

2019-11-19  本文已影响0人  tianlang136520

1、装饰者模式定义:

2、装饰者模式应用场景:

3、装饰者模式优点:

4、装饰者模式缺点:

5、装饰者模式实战:

eg:咖啡店,起初只提供原味coffee,随着用户逐渐增多,客户的需求开始在原味coffe中加糖咖啡,加奶咖啡等等。
未使用装饰者模式代码如下:

类关系图
/**
 * @description: 抽象组件
 * @since 2019-11-10 
 */
public interface IDrink {

    /**
     * 花费
     * @return
     */
    BigDecimal cost();
    /**
     * 详情
     * @return
     */
    String info();

}

/**
 * @description: 具体组件
 * @create: 2019-11-10
 **/
public class Coffee implements IDrink {

    @Override
    public BigDecimal cost() {
        return new BigDecimal("10");
    }
    @Override
    public String info() {
        return "原味Coffee";
    }
}

/**
 * @description: v1 加糖的coffee
 * @create: 2019-11-10 
 **/
public class CoffeeAddMilk implements IDrink {

    @Override
    public BigDecimal cost() {
        return new BigDecimal("20");
    }
    @Override
    public String info() {
        return "加milk的Coffee";
    }
}

/**
 * @description: v1 加冰糖的coffee
 * @create: 2019-11-10
 **/
public class CoffeeAddSuger implements IDrink {

    @Override
    public BigDecimal cost() {
        return new BigDecimal("15");
    }
    @Override
    public String info() {
        return "加冰糖的Coffee";
    }
}
/**
 * @description: v1 测试代码
 * @create: 2019-11-10
 **/
public class App {

    public static void main(String[] args) {

        com.biudefu.decorate.v1.Coffee cafe = new com.biudefu.decorate.v1.Coffee();
        System.out.println(cafe.info()+"---->"+cafe.cost());
        // 想和加糖的coffee
        CoffeeAddMilk milk = new CoffeeAddMilk();
        System.out.println(milk.info()+"---->"+milk.cost());
        // 想加冰糖的coffee
        CoffeeAddSuger suger = new CoffeeAddSuger();
        System.out.println(suger.info()+"---->"+suger.cost());
        // 接下来客户的需求又变了,要及加糖又加milk的,是不是又要创建一个CoffeeAddSugerAndMilk???
    }

}

V2版本采用装饰者模式进行改良:


类关系图
/**
 * @description: 抽象组件
 * @since 2019-11-10
 */
public interface IDrink {

    /**
     * 花费
     * @return
     */
    BigDecimal cost();
    /**
     * 详情
     * @return
     */
    String info();
}
/**
 * @description: 抽象装饰器
 * @create: 2019-11-10
 **/
public abstract class AbstractDecorator implements IDrink {

    private IDrink drink;
    public AbstractDecorator(IDrink drink) {
        this.drink = drink;
    }
    @Override
    public BigDecimal cost() {
        return drink.cost();
    }
    @Override
    public String info() {
        return drink.info();
    }
}

/**
 * @description: 具体组件
 * @create: 2019-11-10 
 **/
public class Coffee implements IDrink{

    @Override
    public BigDecimal cost() {
        return new BigDecimal("10");
    }
    @Override
    public String info() {
        return "原味Coffee";
    }
}
/**
 * @description: 具体装饰类
 * @create: 2019-11-10
 **/
public class MilkDecorator extends AbstractDecorator {

    public MilkDecorator(IDrink drink) {
        super(drink);
    }
    @Override
    public BigDecimal cost() {
        return super.cost().add(new BigDecimal("10"));
    }
    @Override
    public String info() {
        return super.info()+",加入了牛奶🥛!";
    }
}
/**
 * @description: 具体装饰类
 * @create: 2019-11-10
 **/
public class SugerDecorator extends AbstractDecorator {

    public SugerDecorator(IDrink drink) {
        super(drink);
    }
    @Override
    public BigDecimal cost() {
        return super.cost().add(new BigDecimal("5"));
    }
    @Override
    public String info() {
        return super.info()+",加入了冰糖🍬!";
    }
}
/**
 * @description: 装饰器,启动类
 * @create: 2019-11-10
 **/
public class App {
    public static void main(String[] args) {
        // 原味coffee
        Coffee cafe = new Coffee();
        System.out.println(cafe.info() + "---->" + cafe.cost());
        // 原味coffee 添加 牛奶
        MilkDecorator milk = new MilkDecorator(cafe);
        System.out.println(milk.info() + "---->" + milk.cost());
        // 原味coffee继续添加 冰糖
        SugerDecorator s = new SugerDecorator(milk);
        System.out.println(s.info() + "---->" + s.cost());
        // 原味coffee与milk、suger 灵活搭配:原味coffee+milk、原味coffee+suger、原味coffee+milk
        // +suger ,而且将来了如果coffee中加tea,只需要扩展一个TeaDecorator即可
    }
}

6、装饰者模式在源代码中的应用:

Mybatis缓存对象的默认类型为PerpetualCache:

装饰PerpetualCache的标准装饰器共有8个(全部在 org.apache.ibatis.cache.decorators包中):

  1. FifoCache:先进先出算法,缓存回收策略
  2. LoggingCache:输出缓存命中的日志信息
  3. LruCache:最近最少使用算法,缓存回收策略
  4. ScheduledCache:调度缓存,负责定时清空缓存
  5. SerializedCache:缓存序列化和反序列化存储
  6. SoftCache:基于软引用实现的缓存管理策略
  7. SynchronizedCache:同步的缓存装饰器,用于防止多线程并发访问
  8. WeakCache:基于弱引用实现的缓存管理策略
image.png
上一篇下一篇

猜你喜欢

热点阅读