结构性设计模式之装饰器模式
Posted 丨Jack_Chen丨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构性设计模式之装饰器模式相关的知识,希望对你有一定的参考价值。
@TOC
装饰器模式
概述
实现原理
主要角色
装饰器模式主要包含4种角色
1.抽象组件(Component)
2.具体组件(ConcreteComponent)
3.抽象装饰器(Decorator)
4.具体装饰器(ConcreteDecorator)
应用场景
1.用于扩展一个类的功能或给一个类添加附加职责。
2.动态的给一个对象添加功能,这些功能可以再动态的澈销。
3.需要为一批的兄弟类进行改装或加装功能。
优缺点
优点:
1.装饰器是继承的补充,比继承灵活,不改变原有对象的情况下动态地给一个对象扩展功能,即插即用。
2.装饰器完全遵守开闭原则。
缺点:
1.会出现更多的代码,更多的类,增加程序复杂性。
2.通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果。
3.动态装饰时,多层装饰时会更复杂。
装饰器模式的基本使用
创建抽象组件
创建Phone抽象类
public abstract class Phone
public abstract String call();
public abstract double price();
具体组件
创建最基本具有打电话功能的手机
public class BasePhone extends Phone
@Override
public String call()
return "BasePhone call";
@Override
public double price()
return 0.1;
抽象装饰器
创建一个抽象装饰器来扩展该只具备基本功能的手机
public abstract class PhoneDecorator extends Phone
private Phone phone;
public PhoneDecorator(Phone phone)
this.phone = phone;
@Override
public String call()
return phone.call();
@Override
public double price()
return phone.price();
/**
* 扩展功能
*/
public abstract void sendMsg();
具体装饰器
public class SatellitePhoneDecorator extends PhoneDecorator
public SatellitePhoneDecorator(Phone phone)
super(phone);
public void sendMsg()
System.out.println("PhoneCallDecorator sendMsg");
@Override
public String call()
return "SatellitePhone call";
@Override
public double price()
return super.price()+100;
客户端调用
public static void main(String[] args)
// 创建需要被装饰的原始对象(即要被装饰的对象)
Phone phone = new BasePhone();
System.out.println("使用: "+phone.call()+" 方式打电话,每分钟单价:" + phone.price());
// 给对象透明的增加额外功能并调用
PhoneDecorator phoneDecorator = new SatellitePhoneDecorator(phone);
System.out.println("使用: "+phoneDecorator.call()+" 方式打电话,每分钟单价:" + phoneDecorator.price());
// 装饰器也可以装饰具体的装饰对象,相当于给对象在增加的功能基础上在添加功能,这里体现在单价100.1基础上再+100
PhoneDecorator satellitePhoneDecorator = new SatellitePhoneDecorator(phoneDecorator);
System.out.println("使用: "+satellitePhoneDecorator.call()+" 方式打电话,每分钟单价:" + satellitePhoneDecorator.price());
satellitePhoneDecorator.sendMsg();
使用: BasePhone call 方式打电话,每分钟单价:0.1
使用: SatellitePhone call 方式打电话,每分钟单价:100.1
使用: SatellitePhone call 方式打电话,每分钟单价:200.1
PhoneCallDecorator sendMsg
以上是关于结构性设计模式之装饰器模式的主要内容,如果未能解决你的问题,请参考以下文章