装饰者模式(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.运行结果:

最新文章

  1. jquery autocomplete插件
  2. [WinAPI] API 13 [遍历指定目录 打印文件和其他属性]
  3. oracle添加日志表
  4. 如何实现一个malloc
  5. lintcode :前序遍历和中序遍历树构造二叉树
  6. UML建模之活动图介绍(Activity Diagram)
  7. 用ALAssetsLibrary将过滤后图片写入照片库
  8. Html 小插件3
  9. VC socket Connect 超时时间设置
  10. Reflux中文教程——概览
  11. Day-14: 常用的内建模块
  12. mysql不能插入中文数据
  13. JavaScript实现弹窗报错
  14. git逻辑和基本命令
  15. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction 并查集
  16. Xshell 使用数字小键盘进行vim 写入操作.
  17. BZOJ 2159: Crash 的文明世界(树形dp+第二类斯特林数+组合数)
  18. A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK文章笔记
  19. Java并发(一)并发编程的挑战
  20. ASP.Net Core 2.2 MVC入门到基本使用系列 (一)

热门文章

  1. BZOJ-2257:瓶子和燃料(裴蜀定理)
  2. C++之log4cpp库的使用
  3. ceph学习之pool
  4. Ubuntu12.04下安装、使用、卸载MySQL
  5. Linux : Linux命令
  6. 算法导论17:摊还分析学习笔记(KMP复杂度证明)
  7. 深入Mybatis配置文件
  8. Identity Server 4 原理和实战(完结)_Implicit Flow 实例
  9. Makefile研究(三) —— 实际应用
  10. C# in查询