一直都想拥有一个属于自己的技术博客,今天终于开通了,很激动。第一篇随笔就分享一下自己今天刚学习和实践的装饰者设计模式。
一、设计模式到底是什么东西,它有对应的物质吗?
如果我们看不到物质,那么一切的意识都是站不住脚的。那么什么是设计模式呢?它能映射到对应的物质吗?
以前我刚开始接触设计模式是在学习java语言中的面向对象思想,那时候觉得很高大上,因为我看不到设计模式到底是什么,它太神秘了,似乎在我的物质世界了从来没有出现过。之所有会这样子,我想一方面是因为“教者”没有把它的物质给映射出来,另一方面是“学者”没有正确的把握住物质与意识的关系。
设计模式它并没有对应的物质,它映射到的是一种行为方法,而这个行为就是设计,所有说设计模式它讲的就是该以怎么样的方式去设计一样东西,从这样的一个定义来看,其实设计模式对于我们来说其实并不陌生,它并不是只有在软件开发行业才存在,它是只要涉及到具有创造性行为的行业都应该离不开的一种行为方法论。
等等,好像我们对设计模式进行物质映射的时候得到的还是意识“设计方法”,没有看到物质,而是看到了一种行为--设计,对吧。但是,行为它不是凭空出现的,他肯定是需要主体(人)和客体(要设计的东西)的(至少需要主体)。现在有看到物质了吧,是不是看到了主体(人)再对(要设计的东西)进行设计这样一个画面。我们在进行设计的时候,我们不关注主体人怎么样了,而是更加关注客体“要设计的东西”设计成什么样了,对吧。其实我们要设计的东西是来自于身边的某个特定的事物的,换句话说就是模仿某个具体的事物进行设计。这个模仿过程包括模仿具体事物的物理结构和逻辑结构,也就是事物的内在和外在联系。
由此可见,我们研究设计模式,其实本质上是对要模仿事物的内在和外在联系进行研究。
(一)装饰模式是对具有哪些特点的事物进行模仿设计的一种设计行为方式呢?
如果我们所模仿设计的事物是随着时间的发展其内部主体没有发生改变的,但其外在样式和附加功能是有所改变的一类事物(比如房子),那么我们就应该选择装饰模式这种正确的设计行为方式。
(二)软件程序设计(java语言)应如何体系这一设计方法呢?
1.我们来看看类图吧:
(1).我们应该定义一个抽象的Component,作为抽象的被装饰主体,可以是一个抽象的类,也可以是一个接口的,Component中定义一个用于以后拓展的方法。
(2).然后定义一个继承/实现该抽象Component的具体ConcreteComponent组件,该组件对抽象组件进行基础的装饰。
(3).其次定义一个抽象的decorator,该类也是继承于抽象组件(是为了得到和抽象组件相同类型的类,从而可以进行再次装饰),定义一个和抽象组件相同的方法(实现客户端调用的透明性)。
(4).最后定义我们的具体装饰器,该类继承于抽象decorator,我们在里面定义一个抽象的component,定义一个参数持有抽象Component引用的构造方法,接着我们实现抽象decorator的抽象方法,通过回调注入的组件的基础方法进而实现了对注入组件的装饰和附加任务,同时我们也还可以在该类里面定义新的方法对原有组件功能进行拓展。
2.下面是具体的代码(以模拟人穿衣服的场景进行设计):
(1).AbstractPerson.java(抽象component)
package decorator.goldIsAbstact;public abstract class AbstractPerson { public abstract void show();}
(2)Man.java(具体Component:男人)
package decorator.goldIsAbstact;public class Man extends AbstractPerson{ @Override public void show() { System.out.println("I am a common man!"); System.out.println("man before decorate!"); }}
(3)Woman.java(具体Component:女人)
package decorator.goldIsAbstact;public class Woman extends AbstractPerson{ @Override public void show() { System.out.println("I am a common girl"); System.out.println("girl befor decorate!"); }}
(4)Clothing.java(抽象decorator:衣服)
package decorator.goldIsAbstact;public abstract class Clothing extends AbstractPerson { protected AbstractPerson abstractPerson; public Clothing(AbstractPerson abstractPerson) { super(); this.abstractPerson = abstractPerson; } public void show(){ abstractPerson.show(); } }
(5)Jeans.java(具体decorator:牛仔裤)
package decorator.goldIsAbstact;public class Jeans extends Clothing{ public Jeans(AbstractPerson abstractPerson) { super(abstractPerson); // TODO Auto-generated constructor stub } @Override public void show() { System.out.println("我是一条牛仔裤!给男人穿的!开始穿。。。。"); super.show(); System.out.println("穿好了,好看吗?"); } public void jump(){ System.out.println("I can jump!"); }}
(6)Skirt.java(具体decorator:裙子)
package decorator.goldIsAbstact;public class Skirt extends Clothing{ public Skirt(AbstractPerson abstractPerson) { super(abstractPerson); // TODO Auto-generated constructor stub } public void show(){ System.out.println("我是一条裙子,我是给女人穿的!开始穿、、、、、"); super.show(); System.out.println("穿好了,漂亮吗?"); } public void fly () { System.out.println("I can fly!"); }}
(7)Test.java(测试类)
package decorator.goldIsAbstact;public class Test { public static void main(String[] args) { Man weiHeng=new Man(); Woman luXi=new Woman(); weiHeng.show(); luXi.show(); Jeans jeans=new Jeans(weiHeng); jeans.show(); jeans.jump();// Skirt skirt=new Skirt(luXi);// jeans.show();// skirt.show();// // System.out.println("llllllllllllllllllllllllllllllll男变女");// skirt=new Skirt(weiHeng);// skirt.show();// System.out.println("llllllllllllllllllllllllllllllll女变男");// jeans=new Jeans(luXi);// jeans.show(); System.out.println("llllllllllllllllllllllllllllllll女男混合,牛仔里面,裙子在外面"); Skirt skirt=new Skirt(jeans); skirt.fly(); skirt.show(); skirt.fly(); // System.out.println("llllllllllllllllllllllllllllllll女男混合,牛仔外面,裙子在里面");// skirt=new Skirt(luXi);// skirt.fly();// jeans=new Jeans(skirt);// jeans.show();// jeans.jump();// // System.out.println("llllllllllllllllllllllllllllllll女男混合,牛仔外面,裙子在里面,再穿一条牛仔");// jeans=new Jeans(jeans);// jeans.show();// jeans.jump(); }}
3.测试装饰效果:
(三)总结:
以上是模拟人进行穿衣服场景进行了一个模拟设计,从中我们可以看到正确的方法论是多么的重要,同时也体会到了装饰设计模式之美!
下一遍继续写设计方法论中其他的模式。