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("第二餐");
行了。
比较上面两个方法 我感觉还是对象引用好一点 继承调用 的话 ,除非 你定义多个适配器 ,要不然 没法完成。
还没有评论,来说两句吧...