`

装饰着模式

 
阅读更多
该模式挺难理解,想了快一晚上。。。才算有点眉目。。。然后照搬一些java.io类还有servlet里面的过滤器终于有所领悟。
使用接口实现,下面给出代码:


 /** *//**
  *定义被装饰者
  **/
 public interface Human {
     public void wearClothes();
     public void walkToWhere();
 }
 /** *//**
  *定义装饰者是个抽象类
  **/
 public abstract class Decorator implements Human {
     private Human human;
     
     public Decorator(Human human){
         this.human=human;
     }
     public void walkToWhere() {
          human.walkToWhere();
     }
     public void wearClothes() {
          human.wearClothes();
     }
 }
 /** *//**
  *定义三种装饰,这是第一种
  **/
 public class Decorator_zero extends Decorator {
 
     public Decorator_zero(Human human) {
         super(human);
     }
     private void put(){
         System.out.println("进房子");
     }
    private void finMap(){
         System.out.println("书柜找找Map");
     }
     @Override
     public void wearClothes() {
         super.wearClothes();
         put();
     }
     @Override
     public void walkToWhere() {
         super.walkToWhere();
         finMap();
     }
 }
 /** *//**
  *这是第二种
  **/
 public class Decorator_first extends Decorator{
 
     public Decorator_first(Human human) {
         super(human);
     }
     private void put(){
         System.out.println("去衣柜找找");
     }
     private void where(){
         System.out.println("先找张地图");
     }
     @Overrde
     public void wearClothes() {
         super.wearClothes();
         put();
     }
     @Override
    public void walkToWhere() {
         super.walkToWhere();
         where();
     }
 }
 /** *//**
  *这是第三种
  **/
 public class Decorator_second extends Decorator {
 
     public Decorator_second(Human human) {
         super(human);
     }
     private void put(){
         System.out.println("找到一件D&G");
     }
     private void where(){
         System.out.println("从地图上找到神秘花园以及城堡");
     }
     @Override
     public void wearClothes() {
          super.wearClothes();
          put();
     }
     @Override
     public void walkToWhere() {
         super.walkToWhere();
         where();
    }
}
/** *//**
 *定义被装饰者,该被装饰者初始状态会有一些自己的装饰
 **/
public class Person implements Human {

    public void walkToWhere() {
        System.out.println("去哪里呢");
    }
    public void wearClothes() {
        System.out.println("穿什么呢");
    }
}
/** *//**
 *测试类,下面越看越帅。。。怎一个帅字了得。。。这明显
 *是java.io的层次嘛。。。哈哈
 **/
public class Test {
public static void main(String[] args) {
    Human human = new Person();
    Decorator dt = new Decorator_second(new Decorator_first(new Decorator_zero(human)));
        dt.wearClothes();
        dt.walkToWhere();  
    }
}
关键点:
1、Decorator抽象类中,持有Human接口,方法全部委托给该接口调用,目的是交给该接口的实现类即子类进行调用。
2、Decorator抽象类的子类(具体装饰者),里面都有一个构造方法调用super(human),这一句就体现了抽象类依赖于子类实现即抽象依赖于实现的原则。因为构造里面参数都是Human接口,只要是该Human的实现类都可以传递进去,即表现出Decorator dt = new Decorator_second(new Decorator_first(new Decorator_zero(human)));这种结构的样子。所以当调用dt.wearClothes();dt.walkToWhere()的时候,又因为每个具体装饰者类中,都先调用super.wearClothes和super.walkToWhere()方法,而该super已经由构造传递并指向了具体的某一个装饰者类(这个可以根据需要调换顺序),那么调用的即为装饰类的方法,然后才调用自身的装饰方法,即表现出一种装饰、链式的类似于过滤的行为。
3、具体被装饰者类,可以定义初始的状态或者初始的自己的装饰,后面的装饰行为都在此基础上一步一步进行点缀、装饰。
4、装饰者模式的设计原则为:对扩展开放、对修改关闭,这句话体现在我如果想扩展被装饰者类的行为,无须修改装饰者抽象类,只需继承装饰者抽象类,实现额外的一些装饰或者叫行为即可对被装饰者进行包装。所以:扩展体现在继承、修改体现在子类中,而不是具体的抽象类,这充分体现了依赖倒置原则,这是自己理解的装饰者模式。

分享到:
评论

相关推荐

    head first 设计模式装饰着模式C++实现

    ### 装饰者模式(Decorator Pattern)在C++中的应用与实现 #### 概述 装饰者模式是一种结构型设计模式,它允许在不改变现有对象结构的情况下动态地增加对象的功能。通过创建一个装饰类,它包裹了一个现有的类实例...

    单例模式与装饰着模式.md

    通过学习java 简单总结单例模式与装饰者模式,做一下入门总结,主要讲述单例模式中饿汉式与懒汉式的相同点与不同点,方便理解记忆。

    54-Spring设计模式之装饰器模式1

    Spring 设计模式之装饰器模式详解 在软件设计中,经常会遇到需要在不修改原有代码的情况下,添加新的功能或行为。这时,装饰器模式便可以发挥其作用。在 Spring 设计模式中,装饰器模式是非常重要的一种设计模式。 ...

    装饰者模式

    装饰者模式是一种设计模式,属于结构型模式,它在不改变对象自身的基础上,动态地给对象添加一些职责或行为。这种模式通常用于当对现有对象的功能进行扩展时,避免对对象进行子类化,以此来减少类的爆炸性增长和提高...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    装饰者模式Demo

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展其功能,为对象增加新的行为或属性,同时保持了代码的可读性和可...

    设计模式-装饰器模式

    4. 具体装饰(Concrete Decorator):添加了具体组件的新行为,是装饰模式的关键,它实现了抽象组件接口,并在需要的地方调用具体组件的方法。 举个例子,假设我们有一个`Drink`接口,`Coffee`是具体饮料,`...

    设计模式之装饰模式

    装饰模式是一种结构型设计模式,它允许我们向一个对象动态地添加新的行为或责任,而无需修改该对象的源代码。在C#中,装饰模式是通过创建一个包装类(Decorator),该包装类实现了与被装饰对象相同的接口,并持有被...

    开发模式之装饰模式

    ### 开发模式之装饰模式详解 #### 装饰模式定义 装饰模式(Decorator Pattern)是一种结构型设计模式,允许向对象动态地添加新的功能,而无需修改其原有结构。这种模式通过创建一个新的包装类来包裹真实的对象,...

    设计模式之装饰者模式,内含可运行代码

    装饰者模式是面向对象设计中的一种经典模式,它在不修改已有对象的源代码或继承体系的情况下,通过组合的方式动态地给对象添加新的行为或职责。这种模式在实际开发中非常常见,尤其在需要灵活扩展功能,而又不想破坏...

    设计模式 - 装饰模式(C++实例)

    装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在软件工程中非常常见,因为它提供了灵活性,使得我们可以独立于对象的组合来扩展功能。 在C++中,装饰...

    JAVA设计模式学习12——装饰器模式

    2. **动态性**:装饰模式允许我们在运行时动态地为对象添加新功能,而无需修改代码。 3. **组合性**:通过多个装饰者的叠加,可以实现更复杂的功能,这比使用继承来扩展功能更加灵活。 4. **职责分离**:装饰者模式...

    设计模式 - 装饰者模式.rar

    - **ConcreteComponent(具体组件)**:实现了Component接口的类,是装饰模式要装饰的目标对象。它定义了初始行为,不包含任何额外装饰。 - **Decorator(装饰者)**:持有对Component对象的引用,并且实现...

    装饰模式——装饰模式.doc

    装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...

    用装饰模式装饰HttpServletRequest对象

    【装饰模式】是一种设计模式,源自Erich Gamma等人编写的《设计模式:可重用面向对象软件的基础》一书。这种模式在Swing开发中尤为常见,用于增强或改进现有对象的功能,尤其在Web应用程序中,如Java的J2EE环境,...

    Qt设计模式之装饰者模式

    **Qt设计模式之装饰者模式** 装饰者模式(Decorator Pattern)是软件设计模式中的结构型模式之一,它允许在运行时动态地给一个对象添加新的行为或职责,而无需修改对象本身。在Qt库中,装饰者模式也被广泛应用,...

    装饰模式小猪快跑游戏模拟

    装饰模式是一种设计模式,它允许我们在不修改原有对象的基础上,通过添加新的行为或属性来扩展对象的功能。在"装饰模式小猪快跑游戏模拟"这个实例中,我们看到这种模式被巧妙地应用到了一个名为“小猪吃苹果”的游戏...

    装饰者模式Android实例

    装饰者模式是设计模式的一种,属于结构型模式,它的主要目的是动态地给对象添加新的行为或职责,而无需改变对象的原始代码。在Android开发中,装饰者模式的应用相当广泛,尤其是在视图组件的扩展和功能增强上。下面...

Global site tag (gtag.js) - Google Analytics