设计模式——(装饰者模式)(组合模式)

装饰者模式

介绍

动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)。

实例:

有个咖啡店里面有各种咖啡和调料,让他们组合会非常麻烦,这时候出现了装饰者模式,咖啡作为主体,调料作为包装。

步骤:

1.先写Drink主类,里面写入描述和价格的参数,并get/set,并写入一个抽象方法cost(),谁继承谁实现

public abstract class Drink {
	public String des;
	private float price=0.0f;
	public String getDes() {
		return des;
	}
	public void setDes(String des) {
		this.des = des;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public abstract float cost();
}

2.创建咖啡类继承Drink

public class Coffee extends Drink{
	@Override
	public float cost() {
		return super.getPrice();
	}
}

3.创建详细咖啡类并通过set设置名称和价格

public class Espresso extends Coffee{
	public Espresso() {
		setDes("Espresso ");
		setPrice(6.0f);
	}
}
----------------------------------------
public class LongBlack extends Coffee{
	public LongBlack() {
		setDes("Long Black");
		setPrice(5.0f);
	}
}
-----------------------------------------
public class ShortBlack extends Coffee{
	public ShortBlack() {
		setDes("shotr black");
		setPrice(4.0f);
	}
}

4.创建一个装饰者,并通过组合的方式获得咖啡

public class Decorator extends Drink{
	private Drink obj;
	public Decorator(Drink obj) {
		this.obj=obj;
	}
	@Override
	public float cost() {
		return super.getPrice()+obj.cost();
	}
	@Override
	public String getDes() {
		return super.des+" "+super.getPrice()+"&&"+obj.getDes();
	}
}

5.创建调料类

public class Chocolate extends Decorator{
	public Chocolate(Drink obj) {
		super(obj);
		setDes("Chocolate");
		setPrice(3.0f);
	}
}
-----------------------------------------
public class Milk extends Decorator{

	public Milk(Drink obj) {
		super(obj);
		setDes("Milk");
		setPrice(2.0f);
	}

}

6.创建咖啡店

public class CoffeeStore {
	public static void main(String[] args) {
		//先点一份咖啡
		Drink longBlack = new LongBlack();
		System.out.println("fe yong="+longBlack.cost());
		System.out.println("mian shu="+longBlack.getDes());
		//加调料
		longBlack=new Milk(longBlack);
		System.out.println("fe yong="+longBlack.cost());
		System.out.println("mian shu="+longBlack.getDes());
		longBlack=new Chocolate(longBlack);
		System.out.println("fe yong="+longBlack.cost());
		System.out.println("mian shu="+longBlack.getDes());
		longBlack=new Chocolate(longBlack);
		System.out.println("fe yong="+longBlack.cost());
		System.out.println("mian shu="+longBlack.getDes());
	}
}

组合模式

实例:院校展示,学校——院系——专业

传统方案的问题:专业继承院系,院系继承学校。这是从大小组织上看的,但实际他们不存在这种关系。

介绍:

  • 又叫部分整体模式,创建对象的树形结构。
  • 组合模式用来表示整体层次
  • 属于结构型模式
  • 组合模式使得用户对单个对象和组合对象的访问具有一致性

代码:

先创建一个组织类,用来对学校,院系,专业的描述,让他们分别继承这个组织类

package com.kun.composite;

public abstract class OrganizationComponet {
	private String name;
	private String des;
	protected void add(OrganizationComponet organizationComponet) {
		//默认实现
		throw new UnsupportedOperationException();
	}
	protected void remove(OrganizationComponet organizationComponet) {
		//默认实现
		throw new UnsupportedOperationException();
	}
	public OrganizationComponet(String name, String des) {
		super();
		this.name = name;
		this.des = des;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDes() {
		return des;
	}
	public void setDes(String des) {
		this.des = des;
	}
	public abstract void print();
}

创建学校类,继承刚才的组织类,创建一个数组用来存放院系,重写add,remove方法

package com.kun.composite;

import java.util.ArrayList;
import java.util.List;

public class University extends OrganizationComponet{
	List organizationComponets=new ArrayList<>();
	
	public University(String name, String des) {
		super(name, des);
		// TODO Auto-generated constructor stub
	}
	@Override
	protected void add(OrganizationComponet organizationComponet) {
		// TODO Auto-generated method stub
		organizationComponets.add(organizationComponet);
	}
	@Override
	protected void remove(OrganizationComponet organizationComponet) {
		// TODO Auto-generated method stub
		organizationComponets.remove(organizationComponet);
	}
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return super.getName();
	}
	@Override
	public String getDes() {
		// TODO Auto-generated method stub
		return super.getDes();
	}
	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println("=========="+getName()+"========");
		for (OrganizationComponet organizationComponet : organizationComponets) {
			organizationComponet.print();
		}
	}
	
}

创建一个院系类,创建一个数组用来存放专业类

package com.kun.composite;

import java.util.ArrayList;
import java.util.List;

public class College extends OrganizationComponet{
	
List organizationComponets=new ArrayList<>();
	
	public College(String name, String des) {
		super(name, des);
		// TODO Auto-generated constructor stub
	}
	@Override
	protected void add(OrganizationComponet organizationComponet) {
		// TODO Auto-generated method stub
		organizationComponets.add(organizationComponet);
	}
	@Override
	protected void remove(OrganizationComponet organizationComponet) {
		// TODO Auto-generated method stub
		organizationComponets.remove(organizationComponet);
	}
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return super.getName();
	}
	@Override
	public String getDes() {
		// TODO Auto-generated method stub
		return super.getDes();
	}
	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println("=========="+getName()+"========");
		for (OrganizationComponet organizationComponet : organizationComponets) {
			organizationComponet.print();
		}
	}
	
}

创建专业类,因为他是叶子节点,所以不用创建数组存放。

package com.kun.composite;

public class Department extends OrganizationComponet{

	public Department(String name, String des) {
		super(name, des);
		// TODO Auto-generated constructor stub
	}
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return super.getName();
	}
	@Override
	public String getDes() {
		// TODO Auto-generated method stub
		return super.getDes();
	}
	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println(getName());
	}

}

创建Client主类方法测试

package com.kun.composite;

public class Client {
	public static void main(String[] args) {
		OrganizationComponet university = new University("AAA", "1111");
		OrganizationComponet college = new College("ji suan ji", "ji suan ji");
		OrganizationComponet college2 = new College("guan li", "guan li");
		college.add(new Department("ji ying", "ji ying"));
		college.add(new Department("ji wang", "ji wang"));
		college.add(new Department("ji suan", "ji suan"));
		college2.add(new Department("jiu dian", "jiu dian"));
		university.add(college);
		university.add(college2);
		university.print();
	}
}

你可能感兴趣的:(java设计模式,设计模式,组合模式,java)