您的位置:首页 > 其它

设计模式之-----装饰者模式

2015-07-21 09:47 429 查看
今天学习了设计模式里的装饰者模式,所谓的装饰模式,顾名思义,就是将一个对象层层装饰,就如同人穿衣服一样,由内到外,衣服要一层一层的穿好,才能出门,对象也是一样,对象经过层层包装,最后包装好的对象,才是我们最后想要的。

引用百度百科的一句话: 装饰者模式就是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。

用一个例子,更能说明其作用。

(注:本例子是引用了博主为:java_my_life中使用的例子,同时对原来的例子做了很小的变动,特此声明一下,原文链接:装饰模式

首先,包结构如下



这个例子是根据齐天大圣能进行72变化进行的例子,首先定义一个通用的接口,也就是说,不管齐天大圣怎么变,都会有的一个属性,那就是移动。所以,新建接口

package com.wrapper.component;

public interface TheGreatestSage {

public void move();
}


接口新建完之后,当然就是写一个实现类了,齐天大圣的真身,即没有任何包装的时候,是一只猴子,那么,就新建一个猴子类

package com.wrapper.concrete.component;

import com.wrapper.component.TheGreatestSage;

public class Monkey implements TheGreatestSage {

public void move() {
System.out.println("Monkey移动");
}

}


这个猴子类实现了之前的接口方法,很简单,现在的猴子没有任何包装,只是单独的一只猴子而已。

不久之后,猴子遇见了师父,师父要教他72变,所以定义一个change类

package com.wrapper.decorator;

import com.wrapper.component.TheGreatestSage;

public class Change implements TheGreatestSage {

private TheGreatestSage sage;

public Change(TheGreatestSage sage) {
this.sage = sage;
}

public void move() {
sage.move();
}

}


要注意这个change类也要继承接口,因为不管猴子怎么变,接口中的move方法是他本身的属性,不会丢失的。

之后就是具体的变什么了,首先要变成一只小鸟,

package com.wrapper.concrete.decorator;

import com.wrapper.component.TheGreatestSage;
import com.wrapper.decorator.Change;

public class Bird extends Change{

public Bird(TheGreatestSage sage) {
super(sage);
}

@Override
public void move() {
super.move();
System.out.println("Bird Move");
}
}


这里的move方法要注意了,它首先要调用父类的方法,然后调用自己的,否则就和普通的继承没有区别了。

同样的,还有鱼类

package com.wrapper.concrete.decorator;

import com.wrapper.component.TheGreatestSage;
import com.wrapper.decorator.Change;

public class Fish extends Change {

public Fish(TheGreatestSage sage) {
super(sage);
}

@Override
public void move() {
super.move();
System.out.println("Fish Move");
}
}


最后的测试类

package com.wrapper.main;

import com.wrapper.component.TheGreatestSage;
import com.wrapper.concrete.component.Monkey;
import com.wrapper.concrete.decorator.Bird;
import com.wrapper.concrete.decorator.Fish;

public class Client {

public static void main(String[] args) {
TheGreatestSage sage = new Monkey();
// 第一种写法
TheGreatestSage bird = new Bird(sage);
TheGreatestSage fish = new Fish(bird);
// 第二种写法
//TheGreatestSage fish = new Fish(new Bird(sage));
fish.move();
}

}


这样,一个装饰者模式就ok了,通过在声明的时候传递进不同的对象,将对象层层包装,最后得到我们想要的结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: