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


    装饰者模式

    介绍

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

    实例:

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

    步骤:

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

    1. public abstract class Drink {
    2. public String des;
    3. private float price=0.0f;
    4. public String getDes() {
    5. return des;
    6. }
    7. public void setDes(String des) {
    8. this.des = des;
    9. }
    10. public float getPrice() {
    11. return price;
    12. }
    13. public void setPrice(float price) {
    14. this.price = price;
    15. }
    16. public abstract float cost();
    17. }

    2.创建咖啡类继承Drink

    1. public class Coffee extends Drink{
    2. @Override
    3. public float cost() {
    4. return super.getPrice();
    5. }
    6. }

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

    1. public class Espresso extends Coffee{
    2. public Espresso() {
    3. setDes("Espresso ");
    4. setPrice(6.0f);
    5. }
    6. }
    7. ----------------------------------------
    8. public class LongBlack extends Coffee{
    9. public LongBlack() {
    10. setDes("Long Black");
    11. setPrice(5.0f);
    12. }
    13. }
    14. -----------------------------------------
    15. public class ShortBlack extends Coffee{
    16. public ShortBlack() {
    17. setDes("shotr black");
    18. setPrice(4.0f);
    19. }
    20. }

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

    1. public class Decorator extends Drink{
    2. private Drink obj;
    3. public Decorator(Drink obj) {
    4. this.obj=obj;
    5. }
    6. @Override
    7. public float cost() {
    8. return super.getPrice()+obj.cost();
    9. }
    10. @Override
    11. public String getDes() {
    12. return super.des+" "+super.getPrice()+"&&"+obj.getDes();
    13. }
    14. }

    5.创建调料类

    1. public class Chocolate extends Decorator{
    2. public Chocolate(Drink obj) {
    3. super(obj);
    4. setDes("Chocolate");
    5. setPrice(3.0f);
    6. }
    7. }
    8. -----------------------------------------
    9. public class Milk extends Decorator{
    10. public Milk(Drink obj) {
    11. super(obj);
    12. setDes("Milk");
    13. setPrice(2.0f);
    14. }
    15. }

    6.创建咖啡店

    1. public class CoffeeStore {
    2. public static void main(String[] args) {
    3. //先点一份咖啡
    4. Drink longBlack = new LongBlack();
    5. System.out.println("fe yong="+longBlack.cost());
    6. System.out.println("mian shu="+longBlack.getDes());
    7. //加调料
    8. longBlack=new Milk(longBlack);
    9. System.out.println("fe yong="+longBlack.cost());
    10. System.out.println("mian shu="+longBlack.getDes());
    11. longBlack=new Chocolate(longBlack);
    12. System.out.println("fe yong="+longBlack.cost());
    13. System.out.println("mian shu="+longBlack.getDes());
    14. longBlack=new Chocolate(longBlack);
    15. System.out.println("fe yong="+longBlack.cost());
    16. System.out.println("mian shu="+longBlack.getDes());
    17. }
    18. }

    组合模式

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

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

    介绍:

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

    代码:

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

    1. package com.kun.composite;
    2. public abstract class OrganizationComponet {
    3. private String name;
    4. private String des;
    5. protected void add(OrganizationComponet organizationComponet) {
    6. //默认实现
    7. throw new UnsupportedOperationException();
    8. }
    9. protected void remove(OrganizationComponet organizationComponet) {
    10. //默认实现
    11. throw new UnsupportedOperationException();
    12. }
    13. public OrganizationComponet(String name, String des) {
    14. super();
    15. this.name = name;
    16. this.des = des;
    17. }
    18. public String getName() {
    19. return name;
    20. }
    21. public void setName(String name) {
    22. this.name = name;
    23. }
    24. public String getDes() {
    25. return des;
    26. }
    27. public void setDes(String des) {
    28. this.des = des;
    29. }
    30. public abstract void print();
    31. }

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

    1. package com.kun.composite;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class University extends OrganizationComponet{
    5. List organizationComponets=new ArrayList<>();
    6. public University(String name, String des) {
    7. super(name, des);
    8. // TODO Auto-generated constructor stub
    9. }
    10. @Override
    11. protected void add(OrganizationComponet organizationComponet) {
    12. // TODO Auto-generated method stub
    13. organizationComponets.add(organizationComponet);
    14. }
    15. @Override
    16. protected void remove(OrganizationComponet organizationComponet) {
    17. // TODO Auto-generated method stub
    18. organizationComponets.remove(organizationComponet);
    19. }
    20. @Override
    21. public String getName() {
    22. // TODO Auto-generated method stub
    23. return super.getName();
    24. }
    25. @Override
    26. public String getDes() {
    27. // TODO Auto-generated method stub
    28. return super.getDes();
    29. }
    30. @Override
    31. public void print() {
    32. // TODO Auto-generated method stub
    33. System.out.println("=========="+getName()+"========");
    34. for (OrganizationComponet organizationComponet : organizationComponets) {
    35. organizationComponet.print();
    36. }
    37. }
    38. }

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

    1. package com.kun.composite;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class College extends OrganizationComponet{
    5. List organizationComponets=new ArrayList<>();
    6. public College(String name, String des) {
    7. super(name, des);
    8. // TODO Auto-generated constructor stub
    9. }
    10. @Override
    11. protected void add(OrganizationComponet organizationComponet) {
    12. // TODO Auto-generated method stub
    13. organizationComponets.add(organizationComponet);
    14. }
    15. @Override
    16. protected void remove(OrganizationComponet organizationComponet) {
    17. // TODO Auto-generated method stub
    18. organizationComponets.remove(organizationComponet);
    19. }
    20. @Override
    21. public String getName() {
    22. // TODO Auto-generated method stub
    23. return super.getName();
    24. }
    25. @Override
    26. public String getDes() {
    27. // TODO Auto-generated method stub
    28. return super.getDes();
    29. }
    30. @Override
    31. public void print() {
    32. // TODO Auto-generated method stub
    33. System.out.println("=========="+getName()+"========");
    34. for (OrganizationComponet organizationComponet : organizationComponets) {
    35. organizationComponet.print();
    36. }
    37. }
    38. }

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

    1. package com.kun.composite;
    2. public class Department extends OrganizationComponet{
    3. public Department(String name, String des) {
    4. super(name, des);
    5. // TODO Auto-generated constructor stub
    6. }
    7. @Override
    8. public String getName() {
    9. // TODO Auto-generated method stub
    10. return super.getName();
    11. }
    12. @Override
    13. public String getDes() {
    14. // TODO Auto-generated method stub
    15. return super.getDes();
    16. }
    17. @Override
    18. public void print() {
    19. // TODO Auto-generated method stub
    20. System.out.println(getName());
    21. }
    22. }

    创建Client主类方法测试

    1. package com.kun.composite;
    2. public class Client {
    3. public static void main(String[] args) {
    4. OrganizationComponet university = new University("AAA", "1111");
    5. OrganizationComponet college = new College("ji suan ji", "ji suan ji");
    6. OrganizationComponet college2 = new College("guan li", "guan li");
    7. college.add(new Department("ji ying", "ji ying"));
    8. college.add(new Department("ji wang", "ji wang"));
    9. college.add(new Department("ji suan", "ji suan"));
    10. college2.add(new Department("jiu dian", "jiu dian"));
    11. university.add(college);
    12. university.add(college2);
    13. university.print();
    14. }
    15. }

  • 相关阅读:
    Java 对于文件的操作
    CANoe-如何基于CAN协议在诊断控制台诊断通信(5000字保姆级教程)
    用 19 个基本脉动调查问题追踪趋势
    热门Java开发工具IDEA入门指南——从Eclipse迁移到IntelliJ IDEA(三)
    国际化项目开发中关于时间的问题一
    智能运维探索(二) | 如何利用人工智能实现告警关联分析
    问题总结:一个 list 使用 for 遍历,边循环边删除的问题
    Win11如何关闭最近打开项目?Win11关闭最近打开项目的方法
    web网页设计期末课程大作业——汉中印象旅游景点介绍网页设计与实现19页面HTML+CSS+JavaScript
    车载ECU嵌入式设备的诊断测试 – DTC
  • 原文地址:https://blog.csdn.net/qq_45688193/article/details/126061435