设计模式之装饰模式 Decoratory Pattern java

    动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。(GOF《设计模式》)。       

java的拦截器就是装饰模式和代理模式的很好运用。假定有人(IPerson)接口,给接口提供eat()行为,即每个人都要吃饭。然而现代人(Modern)可能在吃饭前要洗手(washHand),吃饭后要散步(walk);然而古代人(Ancients)可能是饭前拜神(worship),饭后舞蹈(dance)。这时我们发现同样是吃饭而饭前饭后则不经相同。我们可以使用继承来解决这样问题,然而继承带来的代价是子类的迅速膨胀,还有就是因为饭前和饭后的行为是不确定的,使用继承实现起来将变得十分困难。使用装饰模式将简化这一实现。

 2) IPerson.java
package org.dql.model;
public interface IPerson {
    public void eat();
}
3) Decorator.java
package org.dql.model;
public class Decorator implements IPerson{
 private IPerson m_Person;
 public Decorator(IPerson person)
 {
  m_Person = person; 
 }
 @Override
 public void eat() {
  m_Person.eat();
 }
}
4) Modern.java
package org.dql.model;
public class Modern extends Decorator {
 public Modern(IPerson person) {
  super(person);
 }
 private void washHands() {
  System.out.println("洗手。。。。。");
 }
 private void walk() {
  System.out.println("散步。。。。。");
 }
 public void eat() {
  washHands();
  super.eat();
  walk();
 }
}
5) Ancients.java
package org.dql.model;
public class Ancients extends Decorator {
 private void worship()
 {
  System.out.println("朝拜神灵。。。。。");
 }
 private void dance()
 {
  System.out.println("舞蹈。。。。。");
 }
 public Ancients(IPerson person) {
  super(person);
 }
 @Override
 public void eat() {
  worship();
  super.eat();
  dance();
 }
}
6) 测试Program.java
package org.dql.model;
public class Program {
 public static void main(String[] args) {
  IPerson person=new Person();
  Decorator newperson=new Modern(person);
  System.out.println("*********现代人吃饭***********");
  newperson.eat();
  Decorator ancients=new Ancients(person);
  System.out.println("/n*********古代人吃饭***********");
  ancients.eat();
 }
}
7) 运行结果
*********现代人吃饭***********
洗手。。。。。
吃饭。。。。
散步。。。。。
*********古代人吃饭***********
朝拜神灵。。。。。
吃饭。。。。
舞蹈。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值