java 桥接模式和适配器模式

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

桥接模式

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

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

public interface Triangle {
    void TraSout();
}

这里定义一个圆形的接口

public interface CIRCLE {

    void CircleSout(String s);
}

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

//这是一个融合类,同时有Triangle 的应用 和实现了 目标接口
public  abstract class CirceEx implements CIRCLE {
    private Triangle trianCla; //这里接口或者几类  反正不要是具体的实现类

    public CirceEx(Triangle trianCla) {
        this.trianCla = trianCla;
    }
    //这里也可在CIRCLE的方法里面写,但这样感觉逻辑上不太通顺
    //这里定义一个方法 作为两个接口的融合,这同时引出另一种思路,也可不对Triangle进行引用,可以同时继承
    public void  fuse(String s){
        System.out.println("融合类的操作");
        this.trianCla.TraSout();
        System.out.println("融合类的操作");
    }
}

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

这是具体类的代码

public class CirBridge extends CirceEx {

    public CirBridge(Triangle trianCla) {
        super(trianCla);
    }

    @Override
    public void CircleSout(String s) {
        System.out.println("因为抽象类虽然继承了接口但是没有实现我 ,所以具体类实现我了");
    }
}

运行

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

结果是
这里写图片描述

适配器模式

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

直接引用

三角形接口的具体实现类

public class TrianCla implements Triangle {

    @Override
    public void TraSout() {
        System.out.println("我是继承的三角形的方法");
    }
}
public class ObjYing implements CIRCLE {
    //三角形接口的直接引用
    private Triangle triangle;
    //构造方法  也可通过Setter方法
    public ObjYing(Triangle triangle) {
        this.triangle = triangle;
    }

    @Override
    public void CircleSout(String s) {
         //这里是对三角形接口方法改造的具体地方
          triangle.TraSout();
        System.out.println("我是对象引用的参数"+s);
    }
}
        Triangle triangle=new TrianCla();
        ObjYing objYing=new ObjYing(triangle);
        objYing.CircleSout("对象引用");

这里写图片描述

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

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

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

public abstract  class  AbstractExtend implements Triangle {

    @Override
    public void TraSout() {
        System.out.println("我是继承调用,在这里写具体方法");
    }
}

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

public class ExtendAbsAdapter extends AbstractExtend implements CIRCLE {



    @Override
    public void CircleSout(String s) {
        this.TraSout();
        System.out.println("我是抽象类继承的,的参数"+s);
    }
}

调用

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

这里写图片描述

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

猜你喜欢

转载自blog.csdn.net/a1064072510/article/details/81843230