喵星之旅-沉睡的猫咪-装饰者模式
装饰者是什么?
装饰者模式是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),动态地给该对象增加一些职责(即增加其额外功能)的模式,属于结构型模式。
采用装饰模式扩展对象的功能比采用继承方式更加灵活。
可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。
装饰者如何实现?
在jdk中最经典的装饰者实现是io流。会了装饰者就会了io流,同样的会了io流也就会了装饰者。
我们分析一下io流的特点:
最上面有4大接口,掌管者整个io流。
io流的实现类有很多,每一个实现类都有各自的特点,但是又都基于某种基础之上。
创建一个io流的实例,很多时候我们需要创建和他在同一个接口的某个其他实例。
其实上面这些就是装饰者的特点:
最上面是接口,定义基本规则。
装饰者的实现类可能是很多的,每一个都是有各自特点,但是应该有一些属于基础的实现。
我们在创建一个装饰者的实例,很可能需要先创建一个基础的实例。
代码实现:
以一个网站的参单栏为例,使用装饰者:
不登录时:问答、文章、精品课、冒泡、商城
登录时:问答、文章、作业、题库、成长墙、精品课、冒泡、商城
实现流程:
创建一个接口,定义基本的功能;
创建一个基础的实现类,作为其他装饰者的依靠;
创建自己的装饰者(实现接口,将基础的实现类或者其他装饰者作为内部属性)。
在装饰者内部更新方法的实现或者扩展新的功能。
代码:
接口
package structure.decorator; /** * * @author bunny~~我是兔子我会喵,我叫喵星兔。 * */ public interface Menu { String showMenu(); }
实现类
package structure.decorator; /** * * @author bunny~~我是兔子我会喵,我叫喵星兔。 * */ public class MenuBase implements Menu { @Override public String showMenu() { return "问答、文章、精品课、冒泡、商城"; } }
装饰者
package structure.decorator; /** * * @author bunny~~我是兔子我会喵,我叫喵星兔。 * */ public class MenuDecorator implements Menu { private Menu menu; public MenuDecorator(Menu menu) { super(); this.menu = menu; } public Menu getMenu() { return menu; } public void setMenu(Menu menu) { this.menu = menu; } @Override public String showMenu() { //直接重写并不常见,常见是根据内部的属性menu提供信息来完成。 //return "问答、文章、作业、题库、成长墙、精品课、冒泡、商城"; return menu.showMenu() + "、作业、题库、成长墙"; } }
测试类
package structure.decorator; /** * * @author bunny~~我是兔子我会喵,我叫喵星兔。 * */ public class Test { public static void main(String[] args) { Menu m1 = new MenuBase(); Menu m2 = new MenuDecorator(new MenuBase()); System.out.println(m1.showMenu()); System.out.println(m2.showMenu()); } }
ps:项目地址 svn://47.105.188.20/kitty/2%E3%80%81code/pattern 用户名密码:reader/reader
作者:喵星兔
出处:https://www.cnblogs.com/kittybunny/
喵星之旅:https://www.cnblogs.com/kittybunny/p/12148641.html
我的视频:https://space.bilibili.com/518581788
更多内容:不咬人的小兔子
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
我是兔子,我会喵,我叫喵星兔~~