结构型模式--桥接模式,组合模式,享元模式(五)

一时失言乱红尘 2023-07-03 07:27 49阅读 0赞

享元模式

定义:提供了减少对象数量从而改善应用所需对象结构的方式。运用共享技术有效地支持大量细粒度对象。

适用场景:常用于系统底层的开发,以便于解决系统性能问题。系统有大量相似的对象、需要缓冲池的场景。

优点:减少对象的创建,降低内存中对象数量,降低系统的内存,提高效率。

缺点:关注内/外部状态、关注线程安全问题。使系统、程序的逻辑复杂化。

理解:就是缓存重复利用的对象,多次使用的同一情况,用到的是同一个对象。

  1. public class EmployeeFactory {
  2. private static final Map<String,Employee> EMPLOYEE_MAP = new HashMap<String,Employee>();
  3. public static Employee getManager(String department){
  4. Manager manager = (Manager) EMPLOYEE_MAP.get(department);
  5. if(manager == null){
  6. manager = new Manager(department);
  7. System.out.print("创建部门经理:"+department);
  8. String reportContent = department+"部门汇报:此次报告的主要内容是......";
  9. manager.setReportContent(reportContent);
  10. System.out.println(" 创建报告:"+reportContent);
  11. EMPLOYEE_MAP.put(department,manager);
  12. }
  13. return manager;
  14. }
  15. private static final String departments[] = {"RD","QA","PM","BD"};
  16. public static void main(String[] args) {
  17. for(int i=0; i<10; i++){
  18. String department = departments[(int)(Math.random() * departments.length)];
  19. Manager manager = (Manager) EmployeeFactory.getManager(department);
  20. manager.report();
  21. }
  22. }
  23. }

组合模式

定义:将对象组合成“部份-整体”的层次结构。使客户端对单个对象和组合对象保持一致的方式处理。

适用场景:处理一个树形结构时。希望客户端可以忽略组合对象与单个对象的差异时。

优点:清楚的定义分层次的复杂对象,表示对象的全部或部份层次。让呵护短忽略了层次差异,方便对整个层次结构进行控制。简化客户端代码,符合开闭原则。

缺点:限制类型时会较为复杂,使设计变得更加抽象。(模糊化课程和目录类)

  1. /**
  2. * 抽象父类
  3. */
  4. public abstract class CatalogComponent {
  5. public void add(CatalogComponent catalogComponent){
  6. throw new UnsupportedOperationException("不支持添加操作");
  7. }
  8. public void remove(CatalogComponent catalogComponent){
  9. throw new UnsupportedOperationException("不支持删除操作");
  10. }
  11. public String getName(CatalogComponent catalogComponent){
  12. throw new UnsupportedOperationException("不支持获取名称操作");
  13. }
  14. public double getPrice(CatalogComponent catalogComponent){
  15. throw new UnsupportedOperationException("不支持获取价格操作");
  16. }
  17. public void print(){
  18. throw new UnsupportedOperationException("不支持打印操作");
  19. }
  20. }
  21. /**
  22. * 课程
  23. */
  24. public class Course extends CatalogComponent {
  25. private String name;
  26. private double price;
  27. public Course(String name, double price) {
  28. this.name = name;
  29. this.price = price;
  30. }
  31. @Override
  32. public String getName(CatalogComponent catalogComponent) {
  33. return this.name;
  34. }
  35. @Override
  36. public double getPrice(CatalogComponent catalogComponent) {
  37. return this.price;
  38. }
  39. @Override
  40. public void print() {
  41. System.out.println("Course Name:"+name+" Price:"+price);
  42. }
  43. }
  44. /**
  45. * 目录
  46. */
  47. public class CourseCatalog extends CatalogComponent {
  48. private List<CatalogComponent> items = new ArrayList<CatalogComponent>();
  49. private String name;
  50. private Integer level;
  51. public CourseCatalog(String name,Integer level) {
  52. this.name = name;
  53. this.level = level;
  54. }
  55. @Override
  56. public void add(CatalogComponent catalogComponent) {
  57. items.add(catalogComponent);
  58. }
  59. @Override
  60. public String getName(CatalogComponent catalogComponent) {
  61. return this.name;
  62. }
  63. @Override
  64. public void remove(CatalogComponent catalogComponent) {
  65. items.remove(catalogComponent);
  66. }
  67. @Override
  68. public void print() {
  69. System.out.println(this.name);
  70. for(CatalogComponent catalogComponent : items){
  71. if(this.level != null){
  72. for(int i = 0; i < this.level; i++){
  73. System.out.print(" ");
  74. }
  75. }
  76. catalogComponent.print();
  77. }
  78. }
  79. }
  80. public static void main(String[] args) {
  81. CatalogComponent linuxCourse = new Course("Linux课程",11);
  82. CatalogComponent windowsCourse = new Course("Windows课程",11);
  83. CatalogComponent javaCourseCatalog = new CourseCatalog("Java课程目录",2);
  84. CatalogComponent mmallCourse1 = new Course("Java电商一期",55);
  85. CatalogComponent mmallCourse2 = new Course("Java电商二期",66);
  86. CatalogComponent designPattern = new Course("Java设计模式",77);
  87. javaCourseCatalog.add(mmallCourse1);
  88. javaCourseCatalog.add(mmallCourse2);
  89. javaCourseCatalog.add(designPattern);
  90. CatalogComponent imoocMainCourseCatalog = new CourseCatalog("主目录",1);
  91. imoocMainCourseCatalog.add(linuxCourse);
  92. imoocMainCourseCatalog.add(windowsCourse);
  93. imoocMainCourseCatalog.add(javaCourseCatalog);
  94. imoocMainCourseCatalog.print();
  95. }

桥接模式

定义:将抽象部份与它的具体实现部份分离,使他们都可以独立地变化。通过组合的方式建立两个类之间的联系,而不是继承。

适用场景:抽象和具体实现间更多灵活性,一个类可能存在多个独立的变化,每个变化都需要独立的扩展。不希望适用继承,或应为多层继承导致系统类的个数剧增。

优点:分离抽象部份及其具体实现部份,提高了系统的可扩展性,符合开闭原则,符合合成复用原则。

缺点:增加了系统的理解与设计难度,需要正确地识别出系统中两个独立的变化。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NDE4NTE4_size_16_color_FFFFFF_t_70

账户

  1. public interface Account {
  2. Account openAccount();
  3. void showAccountType();
  4. }
  5. public class DepositAccount implements Account {
  6. @Override
  7. public Account openAccount() {
  8. System.out.println("打开定期账号");
  9. return new DepositAccount();
  10. }
  11. @Override
  12. public void showAccountType() {
  13. System.out.println("这是一个定期账号");
  14. }
  15. }
  16. public class SavingAccount implements Account {
  17. @Override
  18. public Account openAccount() {
  19. System.out.println("打开活期账号");
  20. return new SavingAccount();
  21. }
  22. @Override
  23. public void showAccountType() {
  24. System.out.println("这是一个活期账号");
  25. }
  26. }

银行

  1. public abstract class Bank {
  2. protected Account account;
  3. public Bank(Account account){
  4. this.account = account;
  5. }
  6. abstract Account openAccount();
  7. }
  8. public class ABCBank extends Bank {
  9. public ABCBank(Account account) {
  10. super(account);
  11. }
  12. @Override
  13. Account openAccount() {
  14. System.out.println("打开中国农业银行账号");
  15. account.openAccount();
  16. return account;
  17. }
  18. }
  19. public class ICBCBank extends Bank {
  20. public ICBCBank(Account account) {
  21. super(account);
  22. }
  23. @Override
  24. Account openAccount() {
  25. System.out.println("打开中国工商银行账号");
  26. account.openAccount();
  27. return account;
  28. }
  29. }
  30. public static void main(String[] args) {
  31. Bank icbcBank = new ICBCBank(new DepositAccount());
  32. Account icbcAccount = icbcBank.openAccount();
  33. icbcAccount.showAccountType();
  34. Bank icbcBank2 = new ICBCBank(new SavingAccount());
  35. Account icbcAccount2 = icbcBank2.openAccount();
  36. icbcAccount2.showAccountType();
  37. Bank abcBank = new ABCBank(new SavingAccount());
  38. Account abcAccount = abcBank.openAccount();
  39. abcAccount.showAccountType();
  40. }

发表评论

表情:
评论列表 (有 0 条评论,49人围观)

还没有评论,来说两句吧...

相关阅读