美文网首页
结构型模式:10-装饰模式

结构型模式:10-装饰模式

作者: 综合楼 | 来源:发表于2021-06-13 13:46 被阅读0次

透明装饰模式

在透明装饰模式中,要求客户端完全针对抽象编程;

Component c, c1; //使用抽象构件类型定义对象
c = new ConcreteComponent();
c1 = new ConcreteDecorator (c);

而不应该使用如下代码:

ConcreteComponent c; //使用具体构件类型定义对象
c = new ConcreteComponent();
或
ConcreteDecorator c1; //使用具体装饰类型定义对象
c1 = new ConcreteDecorator(c);

半透明装饰模式

具体构件类型无须关心,是透明的;但是具体装饰类型必须指定,这是不透明的。

Document doc; //使用抽象构件类型定义
doc = new PurchaseRequest();
Approver newDoc; //使用具体装饰类型定义
newDoc = new Approver(doc);

两者区别

  1. 半透明装饰模式可以给系统带来更多的灵活性,设计相对简单,使用起来也非常方便。
  2. 但是其最大的缺点在于不能实现对同一个对象的多次装饰。
  3. 而且客户端需要有区别地对待装饰之前的对象和装饰之后的对象。

透明装饰模式代码示例

image.png
image.png
//抽象界面构件类:抽象构件类
abstract class Component {
    public abstract void display();
}

//窗体类:具体构件类
class Window extends Component {
    public void display() { System.out.println("显示窗体!"); }
}

//文本框类:具体构件类
class TextBox extends Component {
    public void display()
    {
        System.out.println("显示文本框!");
    }
}

//列表框类:具体构件类
class ListBox extends Component {
    public void display()
    {
        System.out.println("显示列表框!");
    }
}

//构件装饰类:抽象装饰类
class ComponentDecorator extends Component {
    //维持对抽象构件类型对象的引用
    private Component component;
    //注入抽象构件类型的对象
    public ComponentDecorator(Component component) { this.component = component; }
    public void display() { component.display(); }
}

//滚动条装饰类:具体装饰类
class ScrollBarDecorator extends ComponentDecorator {
    public ScrollBarDecorator(Component component) {
        super(component);
    }

    public void display() {
        this.setScrollBar();
        super.display();
    }

    public void setScrollBar() {
        System.out.println("为构件增加滚动条!");
    }
}

//滚动条装饰类:具体装饰类
class BlackBorderDecorator extends ComponentDecorator {
    public BlackBorderDecorator(Component component) {
        super(component);
    }

    public void display() {
        this.setScrollBar();
        super.display();
    }

    public void setScrollBar() {
        System.out.println("为构件增加黑色边框!");
    }
}
class Client {
    public static void main(String args[]) {
        Component component, componentSB, componentBB; //全部使用抽象构件定义
        component = new Window();
        componentSB = new ScrollBarDecorator(component);
        componentBB = new BlackBorderDecorator(componentSB); //将装饰了一次之后的对象继续注入到另一个装饰类中,进行第二次装饰
        componentBB.display();
    }
}

相关文章

  • 23种设计模式

    创建型 工厂模式 ( 工厂方法模式, 抽象工厂模式, 建造者模式 ) 单例模式 原型模式 结构型 适配器模式 装饰...

  • 设计模式分类汇总

    结构型 适配器模式 组合模式 桥接模式 代理模式 装饰者模式 门面模式 享元模式 行为型 责任链模式 命令模式 解...

  • 设计模式(1)工厂模式

    设计模式有 23 种,按大类分的化可以分为三类 创建型(如:工厂模式、单例模式、原型模式等) 结构模式型(如:装饰...

  • JavaScript设计模式

    设计模式分类(23种设计模式) 创建型单例模式原型模式工厂模式抽象工厂模式建造者模式 结构型适配器模式装饰器模式代...

  • 结构型模式:10-装饰模式

    透明装饰模式 在透明装饰模式中,要求客户端完全针对抽象编程; 而不应该使用如下代码: 半透明装饰模式 具体构件类型...

  • 结构型模式:装饰模式

    文章首发:结构型模式:装饰模式 七大结构型模式之四:装饰模式。 简介 姓名 :装饰模式 英文名 :Decorato...

  • 常用的设计模式

    设计模式主要大概分成三类: 1.创建型:单例设计模式、抽象工厂设计模式 2.结构型:MVC 模式、装饰器模式、适配...

  • java23种设计模式

    创建型 抽象工厂模式工厂方法建造者模式原型模式单态模式 结构型 适配器模式桥接模式组合模式外观模式装饰者模式享元模...

  • iOS常用设计模式总结(一)

    设计模式大概分成三类: 1.创建型:单例设计模式、抽象工厂设计模式 2.结构型:MVC 模式、装饰器模式、适配器模...

  • 装饰模式

    个人博客http://www.milovetingting.cn 装饰模式 模式介绍 装饰模式也称为包装模式,结构...

网友评论

      本文标题:结构型模式:10-装饰模式

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