装饰设计模式

来源:互联网 发布:java求3个最小公倍数 编辑:程序博客网 时间:2024/06/09 07:19

装饰设计模式概述:

装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰者,是继承的替代方案。

优点:

使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意的组合这些功能。

缺点:

正因为可以随意组合,所以就可能出现一些不合理的逻辑

package cn.tywei;/** * 第一、定义一个手机规则的接口,能够具有打电话的功能 *  * @author Tywei *  */public interface Phone {    public abstract void call();}
package cn.tywei;/** * 第二、具体的手机 *  * @author Tywei *  */public class IPhone implements Phone {    @Override    public void call() {        System.out.println("手机可以打电话了");    }}
package cn.tywei;/** * 第三、手机装饰的抽象类 *  * @author Tywei *  */public abstract class PhoneDecorate implements Phone {    private Phone p;    public PhoneDecorate(Phone p) {        this.p = p;    }    /**     * 这里重写了call()方法,然后调用了接口里面的打电话的方法     */    @Override    public void call() {        this.p.call();    }}
package cn.tywei;/** * 第四、听彩铃的手机装饰类 *  * @author Tywei *  */public class RingPhoneDecorate extends PhoneDecorate {    public RingPhoneDecorate(Phone p) {        super(p);    }    @Override    public void call() {        System.out.println("我可以听彩铃了");        super.call();    }}
package cn.tywei;/** * 第五、听音乐的手机装饰类 *  * @author Tywei *  */public class MusicPhoneDecorate extends PhoneDecorate {    public MusicPhoneDecorate(Phone p) {        super(p);    }    @Override    public void call() {        super.call();        System.out.println("打完电话可以听音乐了");    }}
package cn.tywei;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.util.Scanner;/** * 第六、测试用 *  * @author Tywei *  */public class PhoneDemo {    public static void main(String[] args) {        Phone p = new IPhone();        p.call();        System.out.println("------------");        // 需求:我想在接电话前,听彩铃        PhoneDecorate pd = new RingPhoneDecorate(p);        pd.call();        System.out.println("------------");        // 需求:我想在接电话后,听音乐        pd = new MusicPhoneDecorate(p);        pd.call();        System.out.println("------------");        // 需求:我想在接电话前听彩铃,然后听音乐        // 自己提供装饰类,在打电话前听彩铃,打电话后听音乐        pd = new RingPhoneDecorate(new MusicPhoneDecorate(p));        pd.call();        System.out.println("------------");        // 想想我们在IO流中的使用        // 字节输入流        // InputStream is = System.in;        // 包装成字符输入流        // InputStreamReader isr = new InputStreamReader(is);        // 包装成快速的字节输入流        // BufferedReader br = new BufferedReader(isr);        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(                System.out));        Scanner sc = new Scanner(System.in);    }}
原创粉丝点击