有趣的设计模式——烟火气息中的装饰模式

Posted 谷哥的小弟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有趣的设计模式——烟火气息中的装饰模式相关的知识,希望对你有一定的参考价值。


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

装饰模式概述

装饰模式定义:动态地给一个对象添加额外的职责和功能。也就是说:我们可以在不使用继承、不改变原有结构的基础上扩展新的内容。举个例子,我们都担心摔碎手机屏幕,所以我们可以在手机的外表面裹一层材料(比如钢化膜,手机套)从而使得手机具有了抗摔的新功能;并且手机原本的功能(打电话,拍照,上网)并没有受到任何影响。嗯哼,看完这个小例子,我们来瞅瞅装饰模式中的四个角色:

  • Component:被装饰的原始抽象(类或接口)组件
  • ConcreteComponent:Component的具体实现类
  • Decorator:抽象装饰者
  • ConcreteDecorator:Decorator的具体实现类

烟火气息中的美食

抚琴路夜市有两样美食:炒饭和炒面。而且,可以在它们中加鸡蛋或者培根。接下来,我就借用这些人间烟火来学习装饰设计模式。

主食Food

要点概述:

  • 1、Food类有名字name属性
  • 2、Food类有价格price属性
  • 3、Food类作为其它主食类的父类
package com.decoratorPattern03;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class Food 
	private String name;
	private double price;

    public Food() 

    public Food(String name,double price) 
    	this.name = name;
        this.price = price;
    
    
    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public double getPrice() 
        return price;
    
    
    public void setPrice(double price) 
        this.price = price;
    




炒饭FriedRice

要点概述:

  • 1、FriedRice类继承自Food类
  • 2、Food类是FriedRice的父类
package com.decoratorPattern03;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class FriedRice extends Food 

    public FriedRice() 
        super("炒饭",12);
    
    


炒面FriedNoodle

要点概述:

  • 1、FriedNoodle类继承自Food类
  • 2、Food类是FriedNoodle的父类
package com.decoratorPattern03;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class FriedNoodle extends Food 

  public FriedNoodle() 
      super("炒面",13);
  



配菜Garnish

要点概述:

  • 1、Garnish类是一个抽象类,作为父类使用
  • 2、Garnish类具有name属性
  • 3、Garnish类具有price属性
  • 4、Garnish类具有(持有)Food属性
  • 5、Garnish类具有抽象方法desc()
  • 6、Garnish类具有抽象方法cost()
package com.decoratorPattern03;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public abstract class Garnish 
	private String name;
	private double price;
	private Food food;
	
	public Garnish() 
	
	public Garnish(String name, double price, Food food) 
		super();
		this.name = name;
		this.price = price;
		this.food = food;
	
	
	public String getName() 
		return name;
	

	public void setName(String name) 
		this.name = name;
	

	public double getPrice() 
		return price;
	

	public void setPrice(double price) 
		this.price = price;
	

	public Food getFood() 
		return food;
	

	public void setFood(Food food) 
		this.food = food;
	
	
	// 描述信息
	public abstract String desc(); 

    //计算价格
    public abstract double cost();  



鸡蛋Egg

要点概述:

  • 1、Egg类是Garnish的子类
  • 2、Egg类具有introduce属性
  • 3、Egg类具有discount属性
  • 4、Egg类重写父类的desc()方法
  • 5、Egg类重写父类的cost()方法
package com.decoratorPattern03;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class Egg extends Garnish 
	// 宣传语
	private String introduce = "美味可口";
	// 折扣价
	private int discount = 1;

    public Egg(Food food) 
       super("鸡蛋",2,food);
    

    @Override
    public String desc() 
    	String desc = super.getName() + super.getFood().getName() + introduce;
        return desc;
    
    
    @Override
    public double cost() 
    	double total = super.getPrice() + super.getFood().getPrice()-discount;
        return total;
    


培根Bacon

要点概述:

  • 1、Bacon类是Garnish的子类
  • 2、Bacon类重写父类的desc()方法
  • 3、Bacon类重写父类的cost()方法
package com.decoratorPattern03;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class Bacon extends Garnish 

    public Bacon(Food food) 
        super("培根",3,food);
    
    
    @Override
    public String desc() 
        return super.getName() + super.getFood().getName();
    

    @Override
    public double cost() 
        return super.getPrice() + super.getFood().getPrice();
    



测试Test

要点概述:

  • 1、在Test创建炒饭并获取相关信息
  • 2、在Test创建蛋炒饭并获取相关信息
  • 3、在Test创建培根炒面并获取相关信息
package com.decoratorPattern03;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class Test 

	public static void main(String[] args) 
		// 炒饭
		FriedRice friedRice = new FriedRice();
		System.out.println(friedRice.getName() + " " + friedRice.getPrice() + "元");
		System.out.println("---------------------");
		
		// 鸡蛋炒饭
		Egg egg = new Egg(new FriedRice());
		System.out.println(egg.desc() + " " + egg.cost() + "元");
		System.out.println("---------------------");
		
		// 培根炒面
		Bacon bacon = new Bacon(new FriedNoodle());
		System.out.println(bacon.desc()+ " " + bacon.cost() + "元");
		System.out.println("---------------------");
	




以上是关于有趣的设计模式——烟火气息中的装饰模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式:装饰模式

深入理解设计模式-装饰者模式

深入理解设计模式-装饰者模式

设计模式之装饰者模式

从零开始学习Java设计模式 | 结构型模式篇:装饰者模式

从零开始学习Java设计模式 | 结构型模式篇:装饰者模式