1、代理模式
创建一个代理对象来控制对另一个对象的访问,以提供额外的功能或限制。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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、适配器模式
- 它允许将不兼容的接口转换为可兼容的接口。
- 适配器模式包括两种类型:类适配器和对象适配器。类适配器使用继承实现,对象适配器使用组合将适配器包装在一个新的对象中。
- 适配器模式常用于需要将现有代码或类库与其他代码集成时,因为这些代码可能具有不同的接口。
类适配和对象适配的异同:
-
一个采用继承,一个采用组合;
-
类适配属于静态实现,对象适配属于组合的动态实现,对象适配需要多实例化一个对象;
-
总体来说,对象适配用得比较多
对象适配器代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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、装饰模式
装饰模式和代理模式都是结构型设计模式,它们的目标是在不改变原始类接口的情况下增强类的功能。但是,它们之间有以下几点不同:
-
目的不同:代理模式的主要目的是控制对对象的访问,而装饰模式则是为了动态地添加或修改对象的行为。
-
所处位置不同:代理模式通常处于调用链的前面,控制对对象的访问,而装饰模式则处于调用链的中间或末尾,动态地添加或修改对象的行为。
-
实现方式不同:代理模式一般是通过创建一个代理对象来控制对另一个对象的访问;而装饰模式则是通过创建一个包装器(Decorator)对象来包裹原始对象,在运行时动态地添加或修改其行为。
-
职责不同:代理模式的职责是将对被代理对象的访问转发给真实的对象,并可能对其进行授权、限制或缓存等处理;而装饰模式则是为对象动态添加新的行为或修改已有行为。
结构型模式总结:代理模式、适配器模式、桥梁模式、装饰模式、门面模式、组合模式和享元模式。
代理模式是做方法增强的,适配器模式是把鸡包装成鸭这种用来适配接口的,桥梁模式做到了很好的解耦,装饰模式从名字上就看得出来,适合于装饰类或者说是增强类的场景,门面模式的优点是客户端不需要关心实例化过程,只要调用需要的方法即可,组合模式用于描述具有层次结构的数据,享元模式是为了在特定的场景中缓存已经创建的对象,用于提高性能。
标签:对象,适配器,代理,模式,Food,设计模式,public,结构型 From: https://www.cnblogs.com/coooookie/p/17430772.html