`
xijunhu
  • 浏览: 155852 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

装饰模式学习

阅读更多

转自:http://java.chinaitlab.com/model/768909_2.html

 

后面的颜色覆盖前面的颜色。

 

新建一个抽象汽车父类:

 

package car_package;
public abstract class car_parent {
    
// 汽车抽象父类
    private String make_address;
    
private int speed;
    
public String getMake_address() {
        
return make_address;
    }
    
public void setMake_address(String make_address) {
        
this.make_address = make_address;
    }
    
public int getSpeed() {
        
return speed;
    }
    
public void setSpeed(int speed) {
        
this.speed = speed;
    }
    
public abstract void print_face();
}

    然后新建一个奥迪汽车子类

 

package car_package;
public class audi_sub extends car_parent {
    
// 奥迪汽车子类
    @Override
    
public void print_face() {
        System.out.println(
"audi车默认的颜色为 黑色");
    }
}

    然后再新建一个装饰者父类:

 

package decorator_package;
import car_package.car_parent;
public abstract class decorator_parent extends car_parent {
    
// 装饰者父类
    
protected car_parent car_parent_ref;
    
public void setCar_parent_ref(car_parent car_parent_ref) {
        
this.car_parent_ref = car_parent_ref;
    }
    @Override
    
public void print_face() {
        car_parent_ref.print_face();
    }
}

    然后再新建装饰者子类:红色火焰装饰者类:

 

package decorator_package;
public class decorator_audi_red extends decorator_parent {
    @Override
    
public void print_face() {
        
super.print_face();
        System.out.println(
"给 奥迪 喷涂鸦 - 颜色为 红色火焰");
    }
}

    然后再新建装饰者子类:紫色霞光装饰者类:

 

package decorator_package;
public class decorator_audi_purple extends decorator_parent {
    @Override
    
public void print_face() {
        
super.print_face();
        System.out.println(
"给 奥迪 喷涂鸦 - 颜色为 紫色霞光");
    }
}

    新建一个运行类

 

package main_run;

import car_package.audi_sub;
import decorator_package.decorator_audi_purple;
import decorator_package.decorator_audi_red;

public class main_run {

    
public static void main(String[] args) {

        audi_sub audi_sub_ref 
= new audi_sub();
        audi_sub_ref.setMake_address(
"北京市朝阳区");
        audi_sub_ref.setSpeed(
200);

        decorator_audi_red decorator_audi_red_ref 
= new decorator_audi_red();
        decorator_audi_red_ref.setCar_parent_ref(audi_sub_ref);

        decorator_audi_purple decorator_audi_purple_ref 
= new decorator_audi_purple();
        decorator_audi_purple_ref.setCar_parent_ref(decorator_audi_red_ref);

        decorator_audi_purple_ref.print_face();
    }
}

    程序运行结果如下:

 

audi车默认的颜色为 黑色
给 奥迪 喷涂鸦 
- 颜色为 红色火焰
给 奥迪 喷涂鸦 
- 颜色为 紫色霞光

    从程序结构中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。

 

 

由于过多使用过多的继承会增加系统的复杂性和偶合性,修改上面代码

 

 

 

package car_package;

public interface car_parent {
 // 汽车抽象父类

 public  void print_face();

}

    然后新建一个奥迪汽车子类

 

package car_package;

public class audi_sub implements car_parent {
 // 奥迪汽车子类
 public void print_face() {
  System.out.println("audi车默认的颜色为 黑色");
 }

}

    然后再新建一个装饰者父类:

 

package decorator_package;

import car_package.car_parent;

public  class decorator_parent implements car_parent {
 // 装饰者父类

 protected car_parent car_parent_ref;

 protected decorator_parent(car_parent car_parent_ref) {
  this.car_parent_ref = car_parent_ref;
 }

 public void print_face() {
  car_parent_ref.print_face();
 }

}

    然后再新建装饰者子类:红色火焰装饰者类:

 

package decorator_package;

import car_package.car_parent;

public class decorator_audi_red extends decorator_parent {

 public decorator_audi_red(car_parent handler) {
       super(handler);
    }

 public void print_face() {
  super.print_face();
  System.out.println("给 奥迪 喷涂鸦 - 颜色为 红色火焰");
 }

}

    然后再新建装饰者子类:紫色霞光装饰者类:

 

package decorator_package;

import car_package.car_parent;

public class decorator_audi_purple extends decorator_parent {

 public decorator_audi_purple(car_parent handler) {
       super(handler);
    }
 public void print_face() {
  super.print_face();
  System.out.println("给 奥迪 喷涂鸦 - 颜色为 紫色霞光");
 }

}

    新建一个运行类

 

package main_run;

import car_package.audi_sub;
import car_package.car_parent;
import decorator_package.decorator_audi_purple;
import decorator_package.decorator_audi_red;

public class main_run {

 public static void main(String[] args) {

  car_parent audi_sub_ref = new audi_sub();


  decorator_audi_red decorator_audi_red_ref = new decorator_audi_red(audi_sub_ref);

  decorator_audi_purple decorator_audi_purple_ref = new decorator_audi_purple(decorator_audi_red_ref);


  decorator_audi_purple_ref.print_face();

 }
}

    程序运行结果如下:

 

audi车默认的颜色为 黑色
给 奥迪 喷涂鸦 
- 颜色为 红色火焰
给 奥迪 喷涂鸦 
- 颜色为 紫色霞光

    从程序结构中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。

 

参考:http://www.jdon.com/designpatterns/decorator.htm

http://blog.csdn.net/lenotang/archive/2008/06/26/2587265.aspx

http://www.iteye.com/topic/121149

分享到:
评论

相关推荐

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”中,作者通过实例讲解了装饰模式的基本概念、结构和应用场景。这篇文章可能是从CSDN博客平台上的一个链接访问的,遗憾的是,由于我们当前无法直接访问该链接,所以...

    设计模式C++学习之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...

    设计模式之装饰模式

    装饰模式是一种结构型设计模式,它允许我们向一个对象动态地添加新的行为或责任,而无需修改该对象...通过学习这些示例,你可以更深入地理解如何在C#中实现和应用装饰模式,以便在自己的项目中有效地利用这一设计模式。

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

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

    装饰模式代码示例

    装饰模式是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码...通过学习这个压缩包中的内容,你将能够更好地掌握装饰模式,并能在自己的代码中灵活运用,提升软件设计的质量和可维护性。

    C#设计模式之Decorator 装饰模式

    总结来说,学习C#中的装饰模式将帮助你更好地理解和利用面向对象的设计原则,如开闭原则(对扩展开放,对修改关闭)。通过实践这些知识点,你可以写出更灵活、可维护的代码,同时避免过度使用继承导致的复杂性。无论...

    实验九:装饰模式.rar

    总结来说,"实验九:装饰模式.rar"中的示例旨在帮助学习者理解装饰模式的基本概念和用法,通过小猪游戏、肖像画装饰和咖啡茶定制这三个具体的场景,展示了如何在实际应用中灵活运用装饰模式,以实现代码的扩展性和可...

    装饰者模式案例学习代码

    装饰者模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为和职责。这种模式在软件工程中广泛应用,因为它提供了一种灵活的方式来扩展对象的功能,而不会破坏其原有的结构。在Java、...

    设计模式装饰模式PPT学习教案.pptx

    设计模式装饰模式PPT学习教案 本资源摘要信息旨在对设计模式中的装饰模式进行详细的介绍和分析,涵盖了装饰模式的定义、结构、实现、应用实例等方面的内容。 一、装饰模式定义 装饰模式是一种用于替代继承的技术...

    Python装饰器模式学习demo

    以上就是"Python装饰器模式学习demo"中涉及的主要内容。通过这个项目,你可以深入理解装饰器的工作原理,以及如何在实际项目中应用它们。实践中,装饰器可用于日志记录、性能测试、权限控制等多种场景,是Python开发...

    装饰者模式Demo

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。...在`DecoratorModeDemo`中,我们可以学习如何创建和使用装饰者模式来动态地增强对象的能力。

    设计模式之装饰模式 Java代码实现

    通过这个实验,我们可以学习到装饰模式如何使代码更具可扩展性和灵活性,而不必对原始类进行硬编码式的修改。 总结,装饰模式是设计模式中的一种,用于在不改变对象自身的基础上,动态地为其添加新的行为。在Java中...

    装饰者模式——Decorator

    在阅读这篇博客和解压后的“decorator”文件后,你可以深入理解装饰者模式的实现细节,学习如何在自己的项目中运用这一模式,以更优雅的方式扩展功能,同时避免过度使用继承导致的类爆炸问题。通过实践和理解装饰者...

    装饰模式Demo

    在这个Java实现的装饰模式Demo中,我们还可以学习到如何创建和使用装饰器对象,以及如何在运行时动态地组合装饰器以实现不同的功能组合。这对于理解和应用装饰模式在实际项目中的应用非常有帮助。通过分析和理解这个...

    [结构型模式] 装饰者模式的理解

    "装饰者模式-类图.pdf"则可能包含更详细的类图,显示了类与类之间的继承和关联关系,有助于深入学习和应用装饰者模式。 总结来说,装饰者模式是一种强大的设计工具,它允许我们在运行时动态地扩展对象的功能,同时...

    装饰模式实例

    通过学习这个装饰模式实例,我们可以更好地理解如何在实际开发中灵活地扩展对象的功能,同时保持代码的整洁和可维护性。装饰模式提供了一种优雅的方式,让我们能够在不破坏封装性的前提下,对对象进行扩展和定制。

    java 装饰模式

    装饰模式是一种结构型设计模式,它允许我们向一个对象添加新的功能或行为,而不改变其原有的类。在Java中,装饰模式通常通过继承和组合来...通过学习和熟练掌握装饰模式,开发者能够更好地设计出适应变化的软件系统。

    java设计模式之装饰者模式代码

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。...通过学习和理解"DecorateModelStudy"中的代码示例,你可以更好地掌握这一模式的应用。

    Android装饰模式demo

    装饰模式是一种设计模式,主要目的是在不改变对象原有结构的情况下,动态地...通过阅读和分析这些代码,开发者可以更好地理解装饰模式如何应用于Android开发,并学习如何在自己的项目中应用这一模式来扩展和定制组件。

Global site tag (gtag.js) - Google Analytics