`

设计模式——装饰模式

    博客分类:
  • java
阅读更多

首先介绍三个重要原则:

  1. 依赖倒转原则:高层模块不应该依赖于底层模块;两者都应该依赖与抽象。抽象不应该依赖于细节,细节应该依赖抽象。
  2. 里氏替换原则:子类型必须能够替换掉他们的父类型。                                                                              如:Animal animal = new cat(); animal.eat(); animal.drink(); animal.run();
  3. 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的指责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或限制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计就会遭受到意想不到的破坏。
  4. 开放封闭原则:对修改关闭,对扩展开放。无论模块是多么的封闭,都会存在一些无法对之封闭的变化。所以,在最初编码时,假设变化不会发生,当变化发生时,创建抽象来隔离发生的同类变化。面对新的需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。

装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活是为已有功能动态地添加更多功能的一种方式。

什么时候用它?

向旧类中添加新代码,新加的代码通常装饰原有类的核心职责或主要行为。

优点:把类中的装饰功能从类中搬移去除,这样简化原有的类。有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。

1. 类图如下:其中

  • Component是定义一个对象接口,可以给这些对象动态的添加职责。
  • ConcreteComponent定义了一个具体的对象,也可以给这个对象添加一些职责。
  • Decorator装饰类,继承了Component,从外类扩展Component的功能,但对于Component类来说无需知道Decorator类的存在。
  • ConcreteDecorator具体的装饰对象,起到给Component添加职责的作用。

2. 如果只有一个ConcreteComponent类而没有Component类,则Decorator类可以直接继承ConcreteComponent类。

3. 如果只有一个ConcreteDecorator类,可以直接把Decrator类与ConcreteDecorator类合为一起。

例子:模拟qq扮靓,注意衣服搭配的顺序可以不同,采用上述第二个类图,无Component类

 

代码如下:

ConcreteComponent, Person类

package cn.edu.tju.decoratorPattern;

//无componet类,只有concreteComponent类Person,让Decorator类直接集成ConcreteComponent类
public class Person {
	
	private String name;
	
	public Person(){};
	
	public Person(String name){
		this.name = name;
	}
	
	public void show(){
		System.out.println("装扮人物: " + name);
	}
}

 Decorator, Finery类

package cn.edu.tju.decoratorPattern;
//Decorator类
public class Finery extends Person{
	
	private Person component;//注意
	
	public void decorate(Person component){
		this.component = component;
	}
	public void show(){
		component.show();
	}
}

 ConcreteDecoratorA, TShirts类

package cn.edu.tju.decoratorPattern;

//ConcreteDecorator类
public class TShirts extends Finery{
	
	public void show(){
		System.out.print("大T恤  ");
		super.show();
	}


}
 

 ConcreteDecoratorB, BigTrouser类

package cn.edu.tju.decoratorPattern;

//ConcreteDecorator类
public class BigTrouser extends Finery{
	
	public void show(){
		System.out.print("垮裤  ");
		super.show();
	}

}
 

 ConcreteDecoratorC, Sneaker类

package cn.edu.tju.decoratorPattern;

//ConcreteDecorator类
public class Sneaker extends Finery{
	
	public void show(){
		System.out.print("破球鞋  ");
		super.show();
	}

}
 

 ConcreteDecoratorD, Suit类

package cn.edu.tju.decoratorPattern;

//ConcreteDecorator类
public class Suit extends Finery{

	public void show(){
		System.out.print("西装  ");
		super.show();
	}
}
 

测试类,Test

package cn.edu.tju.decoratorPattern;

public class Test {
	
	public static void main(String[] args){
		Person harry = new Person("harry");
		System.out.println("第一种装扮:");
		Sneaker sneaker = new Sneaker();//破球鞋
		BigTrouser bTrouser = new BigTrouser();//垮裤
		TShirts tShirt = new TShirts();//大T恤
		
		tShirt.decorate(harry);//按T恤、破球鞋、垮裤的顺序穿,顺序很重要,如裤头外穿则成了superman
		bTrouser.decorate(tShirt);
		sneaker.decorate(bTrouser);
		sneaker.show();
		
		System.out.println("第二种装扮:");
		Suit suit = new Suit();//西装
		suit.decorate(harry);
		suit.show();
	}

}
 
分享到:
评论

相关推荐

    C#设计模式——装饰模式应用实例

    装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为或属性,而不必修改原有类的代码。在C#中,装饰模式常用于扩展对象的功能,同时保持对象接口的一致性。本实例是关于如何在开发图形界面构件库...

    设计模式——GFour

    《设计模式——GFour》是一本深受IT从业者喜爱的经典书籍,尤其在C++开发者中具有广泛影响力。设计模式是软件工程领域中的一种最佳实践,它总结了在特定情境下解决问题的常见方法,使得代码可读性更强,复用性更高,...

    设计模式——刘伟

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。刘伟先生在讲解设计模式时,通常会深入浅出地介绍这些模式的原理、应用场景以及如何有效地在实际编程中应用它们。设计模式并不是...

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

    装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...

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

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

    设计模式——原版的设计模式

    装饰模式动态地给一个对象添加一些额外的职责;外观模式提供了一个统一的接口,用来访问子系统中的多个接口;代理模式为其他对象提供一种代理以控制对这个对象的访问;组合模式将对象组合成树形结构以表示“部分-...

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    设计模式——可复用面向对象软件的基础(1)

    在《设计模式——可复用面向对象软件的基础》这本书中,作者Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称GoF)首次提出了23种面向对象设计模式。这些模式涵盖了不同设计场景,如创建型模式、...

    装饰者模式——Decorator

    在博客文章“装饰者模式——Decorator”中,作者可能详细讲解了以下几个方面: 1. 装饰者模式的基本概念和原理。 2. 如何通过代码示例展示装饰者模式的实现。 3. 装饰者模式与继承的区别和优势。 4. 装饰者模式在...

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    设计模式——JAVA.docx

    ### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    java设计模式——告诉新手一些不知道的东西

    在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...

    Python设计模式之装饰模式实例详解

    本文实例讲述了Python设计模式之装饰...设计模式——装饰模式 装饰模式(Decorator Pattern):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 特点: 有效的把类的核心职责和装饰功能区

Global site tag (gtag.js) - Google Analytics