装饰器模式

基本介绍

1.动态的将新功能附加到对象上,在对象功能扩展方面,比继承更有弹性

2.体现了开闭原则

 

角色

1.Component:抽象主体,被装饰者

(1)是 Decorator 的父类,被组合进 Decorator

2.ConcreteComponent:具体主体,抽象主体的实现子类

3.Decorator:抽象装饰,装饰者

(1)组合并继承 Component

4.ConcreteComponent:具体装饰,抽象装饰的实现子类

 

关系

1.Decorator 继承 Component,Component 是 Decorator 的父类

2.Decorator 组合 Component,即有 Component 属性

3.若 ConcreteComponent 类很多,可以设计一个缓冲层,将共有的部分提取出来,抽象成一个类

 

(例)JDK中IO流的应用

1.InputStream:抽象主体

2.FileInputStream:具体主体

3.FilterInputStream:抽象装饰

4.BufferedInputStream:具体装饰

 

事项

1.优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能

2.缺点:多层装饰比较复杂

3.应用场景

(1)扩展一个类的功能

(2)动态增加、撤销功能

 

桥接模式、装饰者模式

1.桥接模式

(1)分离:结构与实现分离(当结构和实现有可能发生变化时)或属性与基于属性的行为实现分离

(2)行为:横向的行为,行为之间无关联

2.装饰者模式

(1)分离:对基于属性的行为进行封装,成为独立的类

(2)行为:具有可叠加性,其表现出来的结果是一个整体,一个各个行为组合后的一个结果

 

代码示例

public class Decorator {//客户端

    public static void main(String[] args) {
        Drink order = new Espresso();
        System.out.println("饮品:" + order.Name + ",费用:" + order.price);
        System.out.println("总费用:" + order.cost());
        Milk milk = new Milk(order);
        System.out.println("调料:" + milk.Name + ",费用:" + milk.price);
        System.out.println("饮品:" + milk.drink.Name + "费用:" + milk.drink.price);
        System.out.println("总费用:" + milk.cost());
    }
}

class Flavour extends Drink {//抽象装饰

    public Drink drink;//主体

    public Flavour(Drink drink) {
        this.drink = drink;
    }

    @Override
    public float cost() {
        return this.price + drink.cost();//调料费用 + 饮品费用
    }
}

class Milk extends Flavour {//具体装饰

    public Milk(Drink drink) {
        super(drink);
        this.Name = "牛奶";
        this.price = 0.5f;
    }
}

abstract class Drink {//抽象主体
    public String Name;
    public float price = 0.0f;

    public abstract float cost();
}

class Coffee extends Drink {//具体主体与抽象主体的缓冲层

    @Override
    public float cost() {
        return super.price;
    }
}

class Espresso extends Coffee {//具体主体

    public Espresso() {
        this.Name = "意式浓缩";
        this.price = 1.0f;
    }
}

 

posted @   半条咸鱼  阅读(18)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示