初涉装饰器模式

\quad 装饰器模式是GOF23种设计模式中较为常用的一种模式。它可以实现对原有类的包装和装饰,使新的类具有更强的功能。
\quad 我这里有饮料咖啡, 我们可以通过加入牛奶或蔗糖,实现原有饮料口味的扩展和价格的变化。这就是一种“装饰器模式”。 我们在未来给普通人加装“外骨骼”装饰,让普通人具有力扛千斤的能力,也是一种“装饰器模式”。

装饰器模式演示
/**
 * 模拟咖啡
 * 1、抽象组件:需要装饰的抽象对象(接口或抽象父类)
 * 2、具体组件:需要装饰的对象
 * 3、抽象装饰类:包含了对抽象组件的引用以及装饰者共有的方法
 * 4、具体装饰类:装饰的对象
 * @author 影随风
 */
public class DecorateTest02 {
    public static void main(String[] args) {
        Drink coffee = new Coffee();
        Drink suger = new Suger(coffee);   //装饰
        System.out.println(suger.info() + "-->" + suger.cost());
        Drink milk = new Milk(coffee);     //装饰
        System.out.println(milk.info() + "-->" + milk.cost());

        milk = new Milk(suger);            //装饰
        System.out.println(milk.info() + "-->" + milk.cost());
    }
}

//抽象组件
interface Drink {
    double cost();
    String info();
}
//具体组件
class Coffee implements Drink {
    private String name = "原味咖啡";

    @Override
    public double cost() {
        return 10;
    }

    @Override
    public String info() {
        return name;
    }
}
//抽象装饰类
abstract class Decorate implements Drink {
    //对抽象组件的引用
    private Drink drink;

    public Decorate(Drink drink) {
        this.drink = drink;
    }

    @Override
    public double cost() {
        return drink.cost();
    }

    @Override
    public String info() {
        return drink.info();
    }
}
//具体装饰类
class Milk extends Decorate {
    public Milk(Drink drink) {
        super(drink);
    }

    @Override
    public double cost() {
        return super.cost() * 4;
    }

    @Override
    public String info() {
        return super.info() + "加入了牛奶";
    }
}

class Suger extends Decorate {
    public Suger(Drink drink) {
        super(drink);
    }

    @Override
    public double cost() {
        return super.cost() * 2;
    }

    @Override
    public String info() {
        return super.info() + "加入了蔗糖";
    }
}

执行结果
在这里插入图片描述
在IO流中,BufferedInputStream就是对InputStream的一个装饰类,它的缓冲流使得IO效率更高。

public class CopyTxt {
    public static void main(String[] args) {
        String s1 = "abc.txt";
        String s2 = "dest.txt";
        copy(s1, s2);
    }

    public static void copy(String _src, String _des) {
        File src = new File(_src);
        File des = new File(_des);
        //使用JDK7新增的try-with-resources语法省略释放资源操作
        try(BufferedReader br = new BufferedReader(new FileReader(src));
            BufferedWriter bw = new BufferedWriter(new FileWriter(des))) {
            String line = null;
            while((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值