介绍
动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(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();
}
}