IT评测·应用市场-qidao123.com

标题: 设计模式之布局型模式 [打印本页]

作者: 十念    时间: 2025-1-15 10:45
标题: 设计模式之布局型模式
一、布局型模式概述

布局型模式主要用于处置处罚类与对象的组合。它形貌了怎样将类或对象结合在一起形成更大的布局,就像搭积木一样,通过不同的组合方式构建出复杂而强盛的软件架构。其主要目的是简化体系的设计,提高体系的灵活性、可维护性和可扩展性。常见的布局型模式有署理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式和组合模式。
二、署理模式

(一)定义与概念

署理模式是为其他对象提供一种署理以控制对这个对象的访问。在某些情况下,一个对象不得当或者不能直接引用另一个对象,而署理对象可以在客户端和目的对象之间起到中介的作用。
(二)关键要点

(三)代码示例

  1. // 抽象主题接口
  2. interface Subject {
  3. void request();
  4. }
  5. // 真实主题类
  6. class RealSubject implements Subject {
  7. @Override
  8. public void request() {
  9. System.out.println("真实主题执行请求");
  10. }
  11. }
  12. // 代理类
  13. class Proxy implements Subject {
  14. private RealSubject realSubject;
  15. @Override
  16. public void request() {
  17. if (realSubject == null) {
  18. realSubject = new RealSubject();
  19. }
  20. // 访问前的额外操作,如日志记录
  21. System.out.println("代理记录访问日志");
  22. realSubject.request();
  23. }
  24. }
复制代码
在上述代码中,Proxy类署理了RealSubject类,在调用request方法时,先进行了日志纪录操作,然后再调用真实主题的request方法。
三、适配器模式

(一)定义与概念

适配器模式将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原来由于接口不兼容而不能一起工作的那些类可以一起工作。
(二)关键要点

(三)代码示例

  1. // 目标接口
  2. interface Target {
  3. void request();
  4. }
  5. // 适配者类
  6. class Adaptee {
  7. public void specificRequest() {
  8. System.out.println("适配者执行特定请求");
  9. }
  10. }
  11. // 类适配器
  12. class ClassAdapter extends Adaptee implements Target {
  13. @Override
  14. public void request() {
  15. specificRequest();
  16. }
  17. }
  18. // 对象适配器
  19. class ObjectAdapter implements Target {
  20. private Adaptee adaptee;
  21. public ObjectAdapter(Adaptee adaptee) {
  22. this.adaptee = adaptee;
  23. }
  24. @Override
  25. public void request() {
  26. adaptee.specificRequest();
  27. }
  28. }
复制代码
在这个例子中,ClassAdapter通过继续Adaptee类实现了Target接口,ObjectAdapter则通过组合Adaptee对象实现了Target接口,两者都将Adaptee的specificRequest方法适配成了Target接口的request方法。
四、桥接模式

(一)定义与概念

桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象布局型模式,通过将抽象和实现解耦,使得两者可以沿着各自的维度进行扩展。
(二)关键要点

(三)代码示例

  1. // 抽象实现类接口
  2. interface Implementor {
  3. void operationImpl();
  4. }
  5. // 具体实现类A
  6. class ConcreteImplementorA implements Implementor {
  7. @Override
  8. public void operationImpl() {
  9. System.out.println("具体实现类A的操作");
  10. }
  11. }
  12. // 具体实现类B
  13. class ConcreteImplementorB implements Implementor {
  14. @Override
  15. public void operationImpl() {
  16. System.out.println("具体实现类B的操作");
  17. }
  18. }
  19. // 抽象类
  20. abstract class Abstraction {
  21. protected Implementor implementor;
  22. public Abstraction(Implementor implementor) {
  23. this.implementor = implementor;
  24. }
  25. public abstract void operation();
  26. }
  27. // 扩充抽象类
  28. class RefinedAbstraction extends Abstraction {
  29. public RefinedAbstraction(Implementor implementor) {
  30. super(implementor);
  31. }
  32. @Override
  33. public void operation() {
  34. System.out.println("扩充抽象类开始操作");
  35. implementor.operationImpl();
  36. System.out.println("扩充抽象类操作结束");
  37. }
  38. }
复制代码
在上述代码中,Abstraction类与Implementor接口通过构造函数进行关联,实现了抽象与实现的分离。RefinedAbstraction类可以根据不同的Implementor实现类进行不同的操作,体现了桥接模式的灵活性。
五、装饰器模式

(一)定义与概念

装饰器模式动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比天生子类更为灵活。
(二)关键要点

(三)代码示例

  1. // 抽象组件
  2. abstract class Component {
  3. public abstract void operation();
  4. }
  5. // 具体组件
  6. class ConcreteComponent extends Component {
  7. @Override
  8. public void operation() {
  9. System.out.println("具体组件的操作");
  10. }
  11. }
  12. // 抽象装饰器
  13. abstract class Decorator extends Component {
  14. protected Component component;
  15. public Decorator(Component component) {
  16. this.component = component;
  17. }
  18. @Override
  19. public void operation() {
  20. component.operation();
  21. }
  22. }
  23. // 具体装饰器A
  24. class ConcreteDecoratorA extends Decorator {
  25. public ConcreteDecoratorA(Component component) {
  26. super(component);
  27. }
  28. @Override
  29. public void operation() {
  30. super.operation();
  31. // 添加额外功能
  32. System.out.println("具体装饰器A添加的功能");
  33. }
  34. }
  35. // 具体装饰器B
  36. class ConcreteDecoratorB extends Decorator {
  37. public ConcreteDecoratorB(Component component) {
  38. super(component);
  39. }
  40. @Override
  41. public void operation() {
  42. super.operation();
  43. // 添加额外功能
  44. System.out.println("具体装饰器B添加的功能");
  45. }
  46. }
复制代码
在这个例子中,ConcreteDecoratorA和ConcreteDecoratorB可以为ConcreteComponent动态添加不同的功能,而且可以进行多层装饰,如先使用ConcreteDecoratorA装饰,再使用ConcreteDecoratorB装饰。
六、外观模式

(一)定义与概念

外观模式为子体系中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子体系更加轻易使用。
(二)关键要点

(三)代码示例

  1. // 子系统类A
  2. class SubsystemA {
  3. public void operationA() {
  4. System.out.println("子系统A的操作");
  5. }
  6. }
  7. // 子系统类B
  8. class SubsystemB {
  9. public void operationB() {
  10. System.out.println("子系统B的操作");
  11. }
  12. }
  13. // 子系统类C
  14. class SubsystemC {
  15. public void operationC() {
  16. System.out.println("子系统C的操作");
  17. }
  18. }
  19. // 外观类
  20. class Facade {
  21. private SubsystemA subsystemA;
  22. private SubsystemB subsystemB;
  23. private SubsystemC subsystemC;
  24. public Facade() {
  25. subsystemA = new SubsystemA();
  26. subsystemB = new SubsystemB();
  27. subsystemC = new SubsystemC();
  28. }
  29. public void operation() {
  30. subsystemA.operationA();
  31. subsystemB.operationB();
  32. subsystemC.operationC();
  33. }
  34. }
复制代码
在上述代码中,Facade类封装了SubsystemA、SubsystemB和SubsystemC的操作,客户端只需要调用Facade的operation方法,就可以实行一系列子体系的操作,而无需了解子体系内部的具体实现。
七、享元模式

(一)定义与概念

享元模式运用共享技术有效地支持大量细粒度的对象。通过共享已经存在的对象来大幅度减少需要创建的对象数量,避免大量相似类的开销。
(二)关键要点

(三)代码示例

  1. // 抽象享元类
  2. abstract class Flyweight {
  3. protected String intrinsicState;
  4. public Flyweight(String intrinsicState) {
  5. this.intrinsicState = intrinsicState;
  6. }
  7. public abstract void operation(String extrinsicState);
  8. }
  9. // 具体享元类
  10. class ConcreteFlyweight extends Flyweight {
  11. public ConcreteFlyweight(String intrinsicState) {
  12. super(intrinsicState);
  13. }
  14. @Override
  15. public void operation(String extrinsicState) {
  16. System.out.println("具体享元对象的内部状态:" + intrinsicState + ",外部状态:" + extrinsicState);
  17. }
  18. }
  19. // 享元工厂类
  20. class FlyweightFactory {
  21. private Map<String, Flyweight> flyweights = new HashMap<>();
  22. public Flyweight getFlyweight(String intrinsicState) {
  23. if (!flyweights.containsKey(intrinsicState)) {
  24. flyweights.put(intrinsicState, new ConcreteFlyweight(intrinsicState));
  25. }
  26. return flyweights.get(intrinsicState);
  27. }
  28. }
复制代码
在这个例子中,FlyweightFactory类负责创建和管理享元对象,通过共享ConcreteFlyweight对象,减少了对象的创建数量。
八、组合模式

(一)定义与概念

组合模式将对象组合成树形布局以表现 “部分 - 团体” 的条理布局。组合模式使得用户对单个对象和组合对象的使用具有一致性。
(二)关键要点

(三)代码示例

  1. // 抽象组件
  2. abstract class Component {
  3. protected String name;
  4. public Component(String name) {
  5. this.name = name;
  6. }
  7. public abstract void add(Component component);
  8. public abstract void remove(Component component);
  9. public abstract void display(int depth);
  10. }
  11. // 叶子节点
  12. class Leaf extends Component {
  13. public Leaf(String name) {
  14. super(name);
  15. }
  16. @Override
  17. public void add(Component component) {
  18. System.out.println("叶子节点不能添加子节点");
  19. }
  20. @Override
  21. public void remove(Component component) {
  22. System.out.println("叶子节点不能移除子节点");
  23. }
  24. @Override
  25. public void display(int depth) {
  26. for (int i = 0; i < depth; i++) {
  27. System.out.print("-");
  28. }
  29. System.out.println("Leaf: " + name);
  30. }
  31. }
  32. // 组合节点
  33. class Composite extends Component {
  34. private List<Component> children = new ArrayList<>();
  35. public Composite(String name) {
  36. super(name);
  37. }
  38. @Override
  39. public void add(Component component) {
  40. children.add(component);
  41. }
  42. @Override
  43. public void remove(Component component) {
  44. children.remove(component);
  45. }
  46. @Override
  47. public void display(int depth) {
  48. for (int i = 0; i < depth; i++) {
  49. System.out.print("-");
  50. }
  51. System.out.println("Composite: " + name);
  52. for (Component component : children) {
  53. component.display(depth + 2);
  54. }
  55. }
  56. }
复制代码
在上述代码中,Composite类可以包罗多个Component对象(包括Leaf和Composite),形成树形布局。客户端可以统一地对Leaf和Composite进行操作,如添加、移除和显示等。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4