设计模式(二)结构型

发布时间 2023-05-25 12:10:46作者: coooooookie

1、代理模式

创建一个代理对象来控制对另一个对象的访问,以提供额外的功能或限制。

 1 public interface FoodService {
 2     Food makeChicken();
 3     Food makeNoodle();
 4 }
 5 
 6 public class FoodServiceImpl implements FoodService {
 7     public Food makeChicken() {
 8           Food f = new Chicken()
 9         f.setChicken("1kg");
10           f.setSpicy("1g");
11           f.setSalt("3g");
12         return f;
13     }
14     public Food makeNoodle() {
15         Food f = new Noodle();
16         f.setNoodle("500g");
17         f.setSalt("5g");
18         return f;
19     }
20 }
21 
22 // 代理要表现得“就像是”真实实现类,所以需要实现 FoodService
23 public class FoodServiceProxy implements FoodService {
24 
25     // 内部一定要有一个真实的实现类,当然也可以通过构造方法注入
26     private FoodService foodService = new FoodServiceImpl();
27 
28     public Food makeChicken() {
29         System.out.println("我们马上要开始制作鸡肉了");
30 
31         // 如果我们定义这句为核心代码的话,那么,核心代码是真实实现类做的,
32         // 代理只是在核心代码前后做些“无足轻重”的事情
33         Food food = foodService.makeChicken();
34 
35         System.out.println("鸡肉制作完成啦,加点胡椒粉"); // 增强
36           food.addCondiment("pepper");
37 
38         return food;
39     }
40     public Food makeNoodle() {
41         System.out.println("准备制作拉面~");
42         Food food = foodService.makeNoodle();
43         System.out.println("制作完成啦")
44         return food;
45     }
46 }
代理模式

代理模式说白了就是做 “方法包装” 或做 “方法增强”。在面向切面编程中,其实就是动态代理的过程。比如 Spring 中,我们自己不定义代理类,但是 Spring 会帮我们动态来定义代理,然后把我们定义在 @Before、@After、@Around 中的代码逻辑动态添加到代理中。

2、适配器模式

  • 它允许将不兼容的接口转换为可兼容的接口。
  • 适配器模式包括两种类型:类适配器和对象适配器。类适配器使用继承实现,对象适配器使用组合将适配器包装在一个新的对象中。
  • 适配器模式常用于需要将现有代码或类库与其他代码集成时,因为这些代码可能具有不同的接口。

类适配和对象适配的异同:

    • 一个采用继承,一个采用组合;

    • 类适配属于静态实现,对象适配属于组合的动态实现,对象适配需要多实例化一个对象;

    • 总体来说,对象适配用得比较多

对象适配器代码:

 1 public class CockAdapter implements Duck {
 2 
 3     Cock cock;
 4     // 构造方法中需要一个鸡的实例,此类就是将这只鸡适配成鸭来用
 5       public CockAdapter(Cock cock) {
 6         this.cock = cock;
 7     }
 8 
 9     // 实现鸭的呱呱叫方法
10     @Override
11       public void quack() {
12         // 内部其实是一只鸡的咕咕叫
13         cock.gobble();
14     }
15 
16       @Override
17       public void fly() {
18         cock.fly();
19     }
20 }
对象适配器

3、桥梁模式

将抽象部分和实现部分分离来提高系统的灵活性

 

4、装饰模式

装饰模式和代理模式都是结构型设计模式,它们的目标是在不改变原始类接口的情况下增强类的功能。但是,它们之间有以下几点不同:

  1. 目的不同:代理模式的主要目的是控制对对象的访问,而装饰模式则是为了动态地添加或修改对象的行为。

  2. 所处位置不同:代理模式通常处于调用链的前面,控制对对象的访问,而装饰模式则处于调用链的中间或末尾,动态地添加或修改对象的行为。

  3. 实现方式不同:代理模式一般是通过创建一个代理对象来控制对另一个对象的访问;而装饰模式则是通过创建一个包装器(Decorator)对象来包裹原始对象,在运行时动态地添加或修改其行为。

  4. 职责不同:代理模式的职责是将对被代理对象的访问转发给真实的对象,并可能对其进行授权、限制或缓存等处理;而装饰模式则是为对象动态添加新的行为或修改已有行为。

结构型模式总结:代理模式、适配器模式、桥梁模式、装饰模式、门面模式、组合模式和享元模式。
代理模式是做方法增强的,适配器模式是把鸡包装成鸭这种用来适配接口的,桥梁模式做到了很好的解耦,装饰模式从名字上就看得出来,适合于装饰类或者说是增强类的场景,门面模式的优点是客户端不需要关心实例化过程,只要调用需要的方法即可,组合模式用于描述具有层次结构的数据,享元模式是为了在特定的场景中缓存已经创建的对象,用于提高性能。