zoukankan      html  css  js  c++  java
  • Java IO 流 -- 设计模式:装饰设计模式

    在java IO 流中我们经常看到这样的写法:

    ObjectOutputStream oos = new ObjectOutputStream(
    				new BufferedOutputStream(new FileOutputStream("obj.ser")));
    

    这其实就是IO流使用装饰设计模式,装饰设计模式通常包含:
    1、抽象的组件(抽象类或接口)
    2、具体的组件:需要装饰的对象
    3、抽象的装饰:包含了对抽象组件的引用以及装饰着共同的方法
    4、具体的装饰类:被装饰的对象
    下面模拟咖啡用装饰模式,直接上完整代码:

    package com.xzlf.io;
    
    /**
     * 模拟咖啡
     * 1、抽象的组件(抽象类或接口)
     * 2、具体的组件:需要装饰的对象
     * 3、抽象的装饰:包含了对抽象组件的引用以及装饰着共同的方法
     * 4、具体的装饰类:被装饰的对象
     * @author xzlf
     *
     */
    public class DecorateTest02 {
    	public static void main(String[] args) {
    		Drink coffe = new Coffe();
    		Drink milk = new Milk(coffe);
    		System.out.println(milk.info() + "-->" + milk.cost());
    		Drink suger = new Suger(coffe);
    		System.out.println(suger.info() + "-->" +suger.cost());
    		suger = new Suger(milk);
    		System.out.println(suger.info() + "-->" +suger.cost());
    	}
    }
    
    /* 抽象组件 */
    interface Drink{
    	double cost();// 费用
    	String info();// 说明
    	
    }
    
    /* 具体组件 */
    class Coffe 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()*10;
    	}
    	
    	@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() + "加入了蔗糖";
    	}
    }
    

    运行测试:
    在这里插入图片描述

    重视基础,才能走的更远。
  • 相关阅读:
    页面高度自适应方法(PC、移动端都适用)
    Axure 文本框去掉边框 富文本 粘贴文字图标
    Axure 文本框去掉边框 富文本 粘贴文字图标
    mui switch 点击事件不冒泡
    使用vue-router+vuex进行导航守卫(转)
    Layui select下拉框改变之 change 监听事件(转)
    jQuery获取节点和子节点文本的方法
    动态规划(3)——算法导论(18)
    动态规划(2)——算法导论(17)
    Base64编码
  • 原文地址:https://www.cnblogs.com/xzlf/p/12681533.html
Copyright © 2011-2022 走看看