java 桥接模式和适配器模式

Myth丶恋晨 2022-05-16 10:17 261阅读 0赞

最近学习了 一下java设计模式,今天写一下桥接模式和适配器模式

桥接模式

首先,桥接模式,我认为的是在系统实现以前的一种思想,简而言之。就是什么代码都没有的时候 这时候,是使用桥接模式的最好时机。
在现实中,如果厂家要生产衣服,首先 衣服是有款式的,也是有颜色的。 同一款款式有多种颜色,同一种颜色有多种款式。
在java如果要用类表示的话,有一种思路是定义具体的类,比如 圆形红色衣服,三角形红色衣服,三角形绿色衣服。 这样的好处是 很好找,就是具体实现类就太多了。
还有一种思路就是桥接模式,定义一个款式接口,定义一个颜色接口,然后再创建一个抽象类,继承其中一个接口的同时,还要持有一个接口的引用。

下面定义一个三角形的接口

  1. public interface Triangle {
  2. void TraSout();
  3. }

这里定义一个圆形的接口

  1. public interface CIRCLE {
  2. void CircleSout(String s);
  3. }

再定义一个抽象类实现圆形接口的同时,持有一个三角形接口的引用。

  1. //这是一个融合类,同时有Triangle 的应用 和实现了 目标接口
  2. public abstract class CirceEx implements CIRCLE {
  3. private Triangle trianCla; //这里接口或者几类 反正不要是具体的实现类
  4. public CirceEx(Triangle trianCla) {
  5. this.trianCla = trianCla;
  6. }
  7. //这里也可在CIRCLE的方法里面写,但这样感觉逻辑上不太通顺
  8. //这里定义一个方法 作为两个接口的融合,这同时引出另一种思路,也可不对Triangle进行引用,可以同时继承
  9. public void fuse(String s){
  10. System.out.println("融合类的操作");
  11. this.trianCla.TraSout();
  12. System.out.println("融合类的操作");
  13. }
  14. }

接下来 就可以实现具体的桥接模式具体类了,只需要定义一个类继承上面的融合类 。 当然因为我上面这个抽象类 虽然继承了CIRCLE 但是没有实现void CircleSout(String s)方法。所以 具体类extend融合类的时候,还是要重写void CircleSout(String s)方法的。

这是具体类的代码

  1. public class CirBridge extends CirceEx {
  2. public CirBridge(Triangle trianCla) {
  3. super(trianCla);
  4. }
  5. @Override
  6. public void CircleSout(String s) {
  7. System.out.println("因为抽象类虽然继承了接口但是没有实现我 ,所以具体类实现我了");
  8. }
  9. }

运行

  1. public class BridgeMain {
  2. public static void main(String[] args) {
  3. Triangle triangle=new TrianCla();
  4. CirBridge cirBridge=new CirBridge(triangle);
  5. cirBridge.CircleSout("我是桥接模式的参数");
  6. cirBridge.fuse("qiaojie");
  7. }
  8. }

结果是
这里写图片描述

适配器模式

适配器模式 顾名思义 适配嘛。一般用到适配的时候 是至少有一个接口不能改变,通常是两个不能改变,但是又要把它们融合在一起。适配器就出来了。就行usb转网线接口似得。
还是上面的两个接口 三角形接口,和圆形接口。现在在这里这么想有一个圆形插座,通常我们是用圆形插口插上去的,但是现在 我们没有圆形插口,只有三角形插口。那怎么办呢?
当然是 把三角形插口加个转化器,这样不就可以了。转化器和三角形插口变成了一个整体。 然后就可以用圆形插座了
具体思路和上面的桥接模式有很大的相同,都是实现一个接口 然后持有另一个接口的引用,这个引用 也分为两种。 一种可以通过继承,子类调用父类的方法 成员。 还有一种就是直接引用。

直接引用

三角形接口的具体实现类

  1. public class TrianCla implements Triangle {
  2. @Override
  3. public void TraSout() {
  4. System.out.println("我是继承的三角形的方法");
  5. }
  6. }
  7. public class ObjYing implements CIRCLE {
  8. //三角形接口的直接引用
  9. private Triangle triangle;
  10. //构造方法 也可通过Setter方法
  11. public ObjYing(Triangle triangle) {
  12. this.triangle = triangle;
  13. }
  14. @Override
  15. public void CircleSout(String s) {
  16. //这里是对三角形接口方法改造的具体地方
  17. triangle.TraSout();
  18. System.out.println("我是对象引用的参数"+s);
  19. }
  20. }
  21. Triangle triangle=new TrianCla();
  22. ObjYing objYing=new ObjYing(triangle);
  23. objYing.CircleSout("对象引用");

这里写图片描述

继承调用只适合三角形类有一个具体实现类

继承调用的话,我们只需要继承三角形的具体实现类,然后子类就可以调用父类的方法了。 这里说一下 如果具体类很多的话,那么继承调用 总会用到对象引用,那么还不如第一个对象引用方便呢。

先定义一个继承三角形的抽象类 或者具体实现类

  1. public abstract class AbstractExtend implements Triangle {
  2. @Override
  3. public void TraSout() {
  4. System.out.println("我是继承调用,在这里写具体方法");
  5. }
  6. }

定义适配器继承了 上面的三角形AbstractExtend

  1. public class ExtendAbsAdapter extends AbstractExtend implements CIRCLE {
  2. @Override
  3. public void CircleSout(String s) {
  4. this.TraSout();
  5. System.out.println("我是抽象类继承的,的参数"+s);
  6. }
  7. }

调用

  1. ExtendAbsAdapter extendAbsAdapter=new ExtendAbsAdapter();
  2. extendAbsAdapter.CircleSout("第二餐");

这里写图片描述

行了。
比较上面两个方法 我感觉还是对象引用好一点 继承调用 的话 ,除非 你定义多个适配器 ,要不然 没法完成。

发表评论

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

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

相关阅读

    相关 java 模式适配器模式

    最近学习了 一下java设计模式,今天写一下桥接模式和适配器模式 桥接模式 首先,桥接模式,我认为的是在系统实现以前的一种思想,简而言之。就是什么代码都没有的时候 这时

    相关 适配器模式模式

    适配器模式        适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于

    相关 java 模式

    假如有以下场景:                        有这样的需求,如果让你按电脑的品牌和类型来写类的结构,你会怎么写?在不知道桥接模式之前,我们一般是用多重继承结