栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

重学设计模式之 装饰者模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

重学设计模式之 装饰者模式

装饰者设计模式

1.定义

在不改变原有对象的基础之上,将功能附加到对象上

1.1 特点

​ 提供了比继承更有弹性的替代方案(扩展原有对象功能)

1.2 类型 : 结构型

2.适用场景

​ 1、扩展一个类的功能或给一个类添加附加职责

​ 2、动态的给一个对象添加功能,这些功能可以再动态的撤销

3.缺点

1.会出现更多的代码,更多的类,增加程序复杂性

2.动态装饰时 多层装饰时会更复杂

4.优点

1.继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能

2.通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果

3.符合开闭原则

5.装饰者-相关的设计模式

装饰者模式和代理模式

装饰者模式和适配器模式

外观模式和抽象工厂模式

编写代码

  1. 简单代码 具体代码去本文下方的 代码地址
package com.zw.design.pattern.creational.structural.decorator.v2;
public abstract class ABattercake {
    protected String getDesc(){
        return null;
    }
    protected int cost(){
        return 0;
    }
}
package com.zw.design.pattern.creational.structural.decorator.v2;

public class Battercake extends ABattercake {
    protected String getDesc(){
        return "武大郎煎饼";
    }
    protected int cost(){
        return 9;
    }
}

2.编写装饰者聚合类

package com.zw.design.pattern.creational.structural.decorator.v2;


public abstract class AbstractDecorator extends ABattercake {

    private ABattercake aBattercake;

    public AbstractDecorator(ABattercake aBattercake){
        this.aBattercake=aBattercake;
    }
    //如果是抽象方法 子类必须去重写改方法
    public abstract  void doSingle();


    @Override
    protected String getDesc() {
        return this.aBattercake.getDesc();
    }

    @Override
    protected int cost() {
        return this.aBattercake.cost();
    }
}


3.具体实现类

package com.zw.design.pattern.creational.structural.decorator.v2;

public class EggDecorator  extends AbstractDecorator{

    public EggDecorator(ABattercake aBattercake) {
        super(aBattercake);
    }

    @Override
    public void doSingle() {

    }

    @Override
    protected String getDesc() {
        return super.getDesc()+"加一个煎蛋";
    }

    @Override
    protected int cost() {
        return super.cost()+1;
    }
}
//第二个类
package com.zw.design.pattern.creational.structural.decorator.v2;

public class SausageDecorator extends AbstractDecorator{
    public SausageDecorator(ABattercake aBattercake) {
        super(aBattercake);
    }

    @Override
    public void doSingle() {

    }

    @Override
    protected String getDesc() {
        return super.getDesc()+" 加入一根火腿";
    }

    @Override
    protected int cost() {
        return super.cost()+3;
    }
}

4.测试

package com.zw.design.pattern.creational.structural.decorator.v2;

public class TestMain {
    public static void main(String[] args) {
      ABattercake aBattercake;
      aBattercake=new Battercake();
      //加鸡蛋
      aBattercake=new EggDecorator(aBattercake);
      //加火腿
      aBattercake=new SausageDecorator(aBattercake);
      aBattercake=new EggDecorator(aBattercake);

        System.out.println("aBattercake = " + aBattercake.getDesc()+" 价格 "+aBattercake.cost());

    }
}

ulm 设计图

测试结果

框架源码解析

在spring框架当中TransactionAwareCacheDecorator 该类主要目的是提高缓存和事务之间的同步级别


在mybatis 当中使用装饰者模式应用为FifoCache 等

代码如下

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027297.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号