设计模式----装饰模式

来源:互联网 发布:ipmsg mac 编辑:程序博客网 时间:2024/06/05 02:58

什么是装饰模式:

通俗的话来讲就是比如说你刚生下来会走路了,光着屁股满大街跑,这时候你对遮羞没有任何需求这就好比是一个最初是的没有任何需求的类,然后你大一点了知道了害羞就开始穿衣服了,这时候的你的需求也只是说遮羞就可以了,后来你长大了知道爱美了,你的需求就不是只有遮羞这么简单了,开始挑自己喜欢的衣服内衣内裤也要配全了,再后来你的衣服开始变多了,不同的场合要穿不同的衣服,不同的心情要换不同的衣服你的选择更多样化,这时候的你是一个各种各种需求的类,你整个需求变化的过程也就是装饰自己的过程,这就是装饰模式。

用学术一点的语言来说就是装饰模式可以在不使用创造更多子类的情况下直接在原始代码中进行修改,对已有的对象的功能进行增强扩展,你虽然是长大了了 ,但是你还是你,你要穿什么衣服还是需要你决定,也就是说扩展类中的所有功能,都由原始对象完成。

类图:

              

Component是定义的对象接口,可以给这些对象动态的添加职责,ConcreteComponent是定义了一个具体的对象,也就是核心部分,这一部分是不会变更的,里边也可以定义一些自己的功能职责。Decorator这就是装饰抽象类,继承了Component类,然后去拓展Decorator的功能,但是Component并不需要知道Decorator的存在,他只要站好岗就可以了,而下边的则是一个个继承自Decorator的拓展类,每有需求增加,便有一个新的类拓展出来。

装饰模式的优点:

  他的优点在于将核心部分跟装饰功能实现了有效的分离,我还是我 ,一个光溜溜的自己,我要穿什么衣服拿过来又好了  我买了新衣服就相当于我建了一个新的类,我想穿了我就拿过来穿不想穿了就放一边,不同场合穿不同的衣服,只需要调用不同的类实现不同的功能需求即可,核心部分是不会变的,我并没有做出任何改变,我还是我,只不过衣服不一样了。我可以通过装饰让你全副武装到牙齿,也可以让你一丝不挂到内裤,唯一改变不了的就是你这个个体本身。

装饰模式的缺点使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。

具体代码解释实现:

比如说定义一个带有show方法的接口,然后我定义了一个person类,来实现上边的接口,他有自己的属性,这就是核心部分。

然后我定义了一个decorate类(装饰类)同时也实现接口,然后写了T恤,牛仔裤,休闲裤,西装,内衣,内裤....等等各种类全都继承自decorate类,他们自然也是有show方法的

然后 在main函数中  比如说我要出席一个会议这样一个需求,我要穿西装,我只需要创建一个person对象p,为西装创建一个对象x,然后通过decorate类即可实现x.Decorate(p);x.show();即可;比如说现在需求换了,我要去郊游约会,那么创建T恤对象t;创建休闲裤对象k;那么我只需要t.Decorate(p);k.Decorate(t);k.show();这个步骤可以这样解释:第一步 我要用T恤装饰人,然后我要用休闲裤装饰穿了T恤的人,然后把人展现出来就行了,主干部分不变,这是一个不断装饰的过程。

//新建接口

public interface IInterMethod {
  void show();
}

//建立一个peson类实现IInterMethod接口,重写show方法  定义属性
class Person implements IInterMethod{
private String name="张三";
public Person(String name) {
super();
this.name = name;
}
public Person() {
super();
}
@Override
public void show() {
System.out.println(name+"要穿的是:");
}
}
//建立装饰类 
class Decorate implements IInterMethod{
protected IInterMethod component;
public Decorate() {
super();
}
public Decorate(IInterMethod component) {
this.component = component;
}
@Override
public void show() {
component.show();
}
}
//建立T恤类
class Tshire extends Decorate{
public Tshire(IInterMethod component) {
super(component);
}
@Override
public void show() {
// TODO Auto-generated method stub
super.show();
System.out.print("  T恤   ");
}
}
//建立休闲裤的类
class Pants extends Decorate{
public Pants(IInterMethod component) {
super(component);
}
@Override
public void show() {
super.show();
System.out.print("休闲裤  ");
}
}
public class Test {
public static void main(String[] args) {
Pants k=new Pants(new Tshire(new Person()));
k.show();
}
}

输出结果:张三要穿的是:
  T恤   休闲裤  

应用场景:当用户有特殊需求的时候,这时候我们如果再去进行类继承而且去改变主干部分时会增加主类的复杂度,这时候我们只需要新建一个需求类然后对原先进行有顺序的包装即可,不需要改变主类。

0 0
原创粉丝点击