定义:装饰器模式也叫包装模式,是指在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有功能)。
适用场景:
1.用于扩展一个类的功能或给一个类添加附加职责。
2.动态的给一个对象添加功能,这些功能有再动态地撤销。
装饰器模式和代理模式对比:
1.装饰器模式就是一种特殊的代理模式。
2.装饰器模式强调自身的功能扩展。
3.代理模式强调代理过程的控制。
业务场景:
标准基类对象:有问答、文章、精品课、冒泡、商城
登录后扩展的模块:作业、题库、成长墙、私信、消息提醒、个人信息
示例代码:
/**
* 抽象导航条
*/
public abstract class Nav {
abstract String showMenus();
abstract boolean isLogin();
}
/**
* 基础导航条
*/
public class BaseNav extends Nav {
@Override
String showMenus() {
return "问答、文章、精品课、冒泡、商城";
}
@Override
boolean isLogin() {
return false;
}
}
/**
* 基本装饰类
*/
public class NavDecorator extends Nav {
private Nav nav;
public NavDecorator(Nav nav) {
this.nav = nav;
}
@Override
protected String showMenus() {
return this.nav.showMenus();
}
@Override
boolean isLogin() {
return this.nav.isLogin();
}
}
/**
* 扩展的装饰类
*/
public class LoginDecorator extends NavDecorator {
public LoginDecorator(Nav nav) {
super(nav);
}
@Override
protected String showMenus() {
return super.showMenus() + "、作业、题库、成长墙、私信、消息提醒、个人信息";
}
@Override
boolean isLogin() {
return !super.isLogin();
}
}
public class Client {
public static void main(String[] args) {
Nav nav = new BaseNav();
nav = new NavDecorator(nav);
if(!nav.isLogin()) {
System.out.println("游客模式:" + nav.showMenus());
}
nav = new LoginDecorator(nav);
if(nav.isLogin()){
System.out.println("用户模式:" + nav.showMenus());
}
}
}
类图如下:
装饰器模式的优点:
1。装饰器是继承的有力补充,比继承灵活,不改变原有对象的情况下动态地给一个对象扩展功能,即插即用。
2.通过使用不同装饰类以及这些装饰类的排列组合,可实现不同效果。
3.完全遵守开闭原则。
装饰器模式的缺点:
1.会出现更多的代码,更多的类,增加出现复杂性。
2.动态装饰时,多层装饰时会更加复杂。