装饰者模式

来源:互联网 发布:局域网免费聊天软件 编辑:程序博客网 时间:2024/05/16 06:31

装饰者模式:

在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,即通过创建一个包装对象,来包裹真实的对象

特点:

1.装饰对象和真实对象有相同的接口,这样,客户端对象就可以以和真实对象相同的方式和装饰对象交互(装饰类与被装饰类有相同的借口或者抽象父类,装饰类与接口之间有一个中间件)

2.真实对象包含一个真实对象的引用。

3.装饰对象接受所有来自客户端的请求,并把这些请求转发给真实的对象

4.装饰对象可以在转发这些请求以前或者以后增加一些附加功能

设计原则:

1.封装变化部分

2.开-闭原则(不去修改被装饰的类,新建一个装饰类,满足新的功能)

3.面向抽象编程,不要面向实现编程,能够起到很好的接口隔离作用

4.优先使用对象组合,而非类继承

使用场合

1.当我们需要为某个现有的对象动态的增加一个新的功能或者职责时

2.当某个对象的职责经常发生变化或者经常需要动态的增加职责。

装饰着模式中的角色


1.被装饰者抽象 ,是一个接口或者抽象类。在装饰着模式中,必然有一个被提取出来最核心,最原始的类(上图componet类)

2.被装饰者具体实现,即程序中已经实现的类,

3.装饰者,一般是一个抽象类(中间件的概念),实现接口或者抽象的方法。里面必然有一个指向component的引用

4.装饰者实现类,通过调用装饰者中的引用,调用到被装饰者中的相应方法

java sdk 相关设计模式


相关设计模式

1.适配器模式:装饰者模式是在不改变原内容的基础上,动态地增加新的行为;而适配器模式则主要用来填补两个接口之间的差异

2.策略模式:策略模式是以切换运算法则的方式变换功能

demo:

1.被装饰者抽象 IBread

public interface IBread {

// 准备材料

public void prepair();


// 和 面

public void kneadFlour();


// 蒸馒头

public void steamed();


// 加工馒头

public void process();


}

2.被装饰者实现 normalBread

public class normalBreadimplements IBread {


@Override

public void prepair() {

System.out.println("准备材料");

// TODO Auto-generated method stub


}


@Override

public void kneadFlour() {

System.out.println("和面");

// TODO Auto-generated method stub


}


@Override

public void steamed() {

System.out.println("蒸馒头了");

// TODO Auto-generated method stub


}


@Override

public void process() {

prepair();

kneadFlour();

steamed();

// TODO Auto-generated method stub

}

}


3.装饰者 AbstractBread,里面包含了被装饰者抽象引用

public class AbstractBreadimplements IBread {


public AbstractBread(IBread iBread) {

super();

this.iBread = iBread;

}


private IBreadiBread;//被装饰对象的引用


@Override

public void prepair() {

this.iBread.prepair();

// TODO Auto-generated method stub


}


@Override

public void kneadFlour() {

this.iBread.kneadFlour();

// TODO Auto-generated method stub


}


@Override

public void steamed() {

this.iBread.steamed();

// TODO Auto-generated method stub


}


@Override

public void process() {

//此处是关键

prepair();

kneadFlour();

steamed();

// this.iBread.process();

// TODO Auto-generated method stub


}

}

4.装饰者 实现(cronBread) 添加玉米素

public class cronBreadextends AbstractBread {


public cronBread(IBread iBread) {

super(iBread);

// TODO Auto-generated constructor stub

}

// 被装饰的方法

public void paint() {

System.out.println("添加柠檬黄着色剂...");

}

@Override

public void kneadFlour() {

paint();// 在和面前添加染色剂

super.kneadFlour();

// TODO Auto-generated method stub

}}

5.装饰者实现(sweetBread) 添加甜蜜素

public class sweetBreadextends AbstractBread {


public sweetBread(IBread iBread) {

super(iBread);

// TODO Auto-generated constructor stub

}


public void paint() {

System.out.println("添加甜蜜素");

}


@Override

public void kneadFlour() {

paint();

super.kneadFlour();

// TODO Auto-generated method stub


}


}

6.测试类

IBread normal = new normalBread();

normal=new cronBread(normal);

normal=new sweetBread(normal);

normal.process();








0 0