装饰者模式--Java篇
2024-08-29 23:06:03
装饰者模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活。
1.定义接口,可以动态的给对象添加职责。
package com.lujie; public interface SuperPerson {
//定义一个接口,可以动态的给对象添加职责
public abstract void show() ;
}
2.实现这个接口
package com.lujie; public class Person implements SuperPerson{
private String name;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name) {
this.name=name;
}
//具体对象的操作
public void show() {
System.out.println("装饰者:"+name);
}
}
3.装饰类
package com.lujie; public class Finery extends Person{
protected Person component;
//设置component
public void Decorate(Person component) {
this.component=component;
}
//重写show(),实际执行的是component的show()操作
public void show() {
if(component!=null){
component.show();
}
} }
4.具体实现的装饰类
package com.lujie; public class Shoes extends Finery{
//首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
public void show() {
System.out.println("皮鞋");
super.show();
}
}
package com.lujie; public class Suit extends Finery{
//首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
public void show() {
System.out.println("西装");
super.show();
}
}
package com.lujie;
//具体服饰类
public class TShirts extends Finery{
//首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
public void show() {
System.out.println("大体恤");
super.show();
}
}
package com.lujie; public class WearSneakers extends Finery{
public void show() {
System.out.println("破球鞋");
super.show();
}
}
5.测试用例:
package com.lujie; public class PersonShowMain { public static void main(String[] args) {
// TODO Auto-generated method stub
Person person=new Person("小明");
System.out.println("第一种装扮:");
WearSneakers wSneakers=new WearSneakers();
BigTrouser bigTrouser=new BigTrouser();
TShirts tShirts=new TShirts();
//装饰过程
wSneakers.Decorate(person);
bigTrouser.Decorate(wSneakers);
tShirts.Decorate(bigTrouser);
tShirts.show();
//装饰过程二
System.out.println("第二种装扮:");
Suit suit=new Suit();
wSneakers.Decorate(person);
bigTrouser.Decorate(wSneakers);
suit.Decorate(bigTrouser);
suit.show();
} }
6.运行结果:
最新文章
- jquery autocomplete插件
- [WinAPI] API 13 [遍历指定目录 打印文件和其他属性]
- oracle添加日志表
- 如何实现一个malloc
- lintcode :前序遍历和中序遍历树构造二叉树
- UML建模之活动图介绍(Activity Diagram)
- 用ALAssetsLibrary将过滤后图片写入照片库
- Html 小插件3
- VC socket Connect 超时时间设置
- Reflux中文教程——概览
- Day-14: 常用的内建模块
- mysql不能插入中文数据
- JavaScript实现弹窗报错
- git逻辑和基本命令
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction 并查集
- Xshell 使用数字小键盘进行vim 写入操作.
- BZOJ 2159: Crash 的文明世界(树形dp+第二类斯特林数+组合数)
- A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK文章笔记
- Java并发(一)并发编程的挑战
- ASP.Net Core 2.2 MVC入门到基本使用系列 (一)