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