设计模式之装饰模式
Posted 路过你的全世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之装饰模式相关的知识,希望对你有一定的参考价值。
什么叫装饰模式?
我们知道,如果想对某个类进行功能扩充,一般就会想到使用继承(对拓展开放,对修改关闭的开闭原则)。如果我们不使用继承的话还有没有其他方式来实现呢?答案是有的:就是使用装饰模式;
装饰模式也叫做包装模式,结构型设计模式之一。可以用来动态透明的方式来拓展对象的功能。可以看做是继承关系的一种补充(替代)。
装饰模式的定义
动态的为一个对象添加一些额外的职责。就增加功能来说,装饰模式相比继承更为灵活
装饰模式的简单实现
首先创建一个用于被装饰的抽象类person
public abstract class Person //定义一个穿着的抽象方法 public abstract void dressed();
第二步创建被装饰的实体类boy,该类继承person,实现了其中的方法
public class Boy extends Person @Override public void dressed() System.out.println("男孩穿了内裤");
创建装饰者的抽象类PersonCloth,该类继承Person类,保持一个person类的引用
//抽象的装饰者,持有一个Person抽象类(基类)的引用 public class PersonCloth extends Person private Person mPerson; public PersonCloth(Person person) mPerson = person; @Override public void dressed() //调用Person的dressed方法 mPerson.dressed();
接下来我们就可以创建实际的装饰者类了,显而易见,该类需要继承PersonCloth。我们创建两个装饰类:CheapCloth、ExpensiveCloth:
CheapCloth.java
public class CheapCloth extends PersonCloth public CheapCloth(Person person) super(person); private void dressShirt() System.out.println("穿件便宜的短袖"); private void dressJean() System.out.println("穿着便宜的牛仔裤"); @Override public void dressed() //增强的dressed方法 super.dressed(); dressShirt(); dressJean();
ExpensiveCloth.java
public class ExpensiveCloth extends PersonCloth public ExpensiveCloth(Person person) super(person); private void dressShirt() System.out.println("穿件昂贵短袖"); private void dressJean() System.out.println("穿着昂贵的牛仔裤"); @Override public void dressed() //增强的dressed方法 super.dressed(); dressShirt(); dressJean();
上面的这两个类都继承了抽象类PersonColth类,从代码中我们可以看到,这两个类“丰富”了原来的dressed方法,实现了动态增加功能的预期。
main函数调用
public class MainTest public static void main(String[] args) Person person = new Boy(); //使用装饰者:穿上便宜的衣服 PersonCloth colthCheap = new CheapCloth(person); colthCheap.dressed(); System.out.println("~~~~~~~~~~~~~~~~~~"); //使用装饰者:穿上昂贵的衣服 PersonCloth colthExpensive = new ExpensiveCloth(person); colthExpensive.dressed();
以上代码很简单,我们直接看打印的结果:
男孩穿了内裤
穿件便宜的短袖
穿着便宜的牛仔裤
~~~~~~~~~~~~~~
男孩穿了内裤
穿件昂贵短袖
穿着昂贵的牛仔裤
总结
装饰模式并不复杂,其本质更像是一种对类的封装还有调用。装饰模式和代理模式很相似,但是却比代理模式稍微复杂点。装饰模式是以对客户端透明的方式扩充对象的功能,是继承关系的一种替代方案。并可以对所装饰的对象增强其功能;代理模式的核心是指给一个对象提供一个代理对象,并由代理对象控制对原有对象的引用,并不能增强原对象的功能。
以上是关于设计模式之装饰模式的主要内容,如果未能解决你的问题,请参考以下文章