装饰器模式
基本介绍
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;
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战