java设计模式之桥梁模式(Bridge)
1.桥梁模式 与 策略模式 非常相似
(其实很多设计模式都相似,因为所有的模式都是按照设计原则 而设计出来的,设计原则就相当于武功的心法,设计模式就是招式,只要心法过硬,就可以无招胜有招了。)
这里也有比较详细的说明 策略模式 VS 桥梁模式 (画画,使用蜡笔和使用毛笔以及颜料的区别)
好了,这里先说 桥梁模式,最后再总结两者的区别
2.桥梁模式(还是那样,设计模式就是为了代码健壮,代码重用,所以高内聚,低耦合永远都是那么受欢迎,什么抽象类啊,接口啊···)
场景,农民施肥。
这里农民类 调用 肥料类,用的是组合的方式,也就是农民类中有一个成员属性是肥料类类型的(就是这里起到了桥梁的作用),
为了可扩展性,农民类写成抽象类,肥料类则写成接口;
在施肥这个动作中,不仅肥料的种类会变,而且农民这边也会改变,人工施肥,或者机器施肥等等,所以这里又两个可变因子。
而且这两个可变因子还可以随机组合的,如 人工施 化肥,人工施有机肥;或者 机器人施化肥,机器人施有机肥。
肥料接口 Manure:
package design.patterns.bridge2;
/**
* 肥料类
* */
public interface Manure {
void manuring();
}
使用接口的原因很简单,多态嘛
有机肥类,动物肥类 AnimalManure:
package design.patterns.bridge2;
public class AnimalManure implements Manure{
@Override
public void manuring() {
System.out.println("==这是动物肥料,也就是翔····");
}
}
化肥类 ChemicalManure:
package design.patterns.bridge2;
public class ChemicalManure implements Manure{
@Override
public void manuring() {
System.out.println("==我是化肥···!");
}
}
然后到抽象类 农民类 Farmer:
package design.patterns.bridge2;
/**
* 农民类
* */
public abstract class Farmer {
protected Manure manure; public Farmer(Manure manure){
this.manure = manure;
} abstract void doManuring(); }
人类农民 HumanFarmer:
package design.patterns.bridge2;
public class HumanFarmer extends Farmer{
public HumanFarmer(Manure manure) {
super(manure);
}
@Override
void doManuring() {
System.out.println("我是大农民,我爱劳动");
manure.manuring();
}
}
当科技发达后,可能会有机器人来施肥的 RobotFarmer:
package design.patterns.bridge2;
public class RobotFarmer extends Farmer{
public RobotFarmer(Manure manure) {
super(manure);
}
@Override
void doManuring() {
System.out.println("机器人也可以施肥的哦。");
manure.manuring();
}
}
最后测试一下 Test类:
package design.patterns.bridge2;
public class Test {
public static void main(String[] args){
//开始施肥
// //1.准备肥料
// Manure manure = new AnimalManure();
//4.突然想施化肥了,
Manure manure = new ChemicalManure();
//2.人工施肥,施的是有机肥, 动物肥
Farmer farmer = new HumanFarmer(manure);
// //5.人工施肥,的确较慢,以后会有机器人施肥的
// Farmer farmer = new RobotFarmer(manure);
//3.开工
work(farmer);
}
public static void work(Farmer farmer){
farmer.doManuring();
}
}
哎,真的惭愧,感觉我的例子说服力一般,如果理解不了,参考这里桥梁模式(Bridge)(不同平台备分不同格式的log文件)
3.总结:
Strategy(策略模式)是调用者不变,变的只是被调用的方法;(候选模式嘛)
Bridge(桥梁模式)是 调用者和被调用者都可以改变。--可以看成策略模式的加强版(更加一步)
java设计模式之桥梁模式(Bridge)的更多相关文章
- JAVA设计模式之桥梁模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...
- java 设计模式 之 桥梁模式
桥梁模式:将抽象和实现解耦,使两者可以独立的变化.解释:将两个有组合关系,强耦合的对象,各自抽象然后解耦.(类关系图看https://www.cnblogs.com/blogxiao/p/951388 ...
- 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
桥接模式Bridge Bridge 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来 意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展. 意图解析 依赖倒置原 ...
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- 折腾Java设计模式之备忘录模式
原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...
随机推荐
- VirtualBox 安装Centos7 无法上网 ping不同的解决方法
进入目录: cd /etc/sysconfig/network-scripts/ 用ls命令查看网卡配置文件名(在CENTOS7中网卡名貌似变成了随机数字,所以每台机器的网卡名并不相同) 编辑网卡配置 ...
- 在ie6下将png24图片透明
没想到IETester中IE6和IE6真实版本不一样...之前一直没有实现png图片的透明度,现在发现原来是版本不一样惹的祸.总之,我将解决方法以demo的方式显示出来,以供再次利用. <!DO ...
- [Erlang09]Erlang gen_server实现定时器(interval)的几种方法及各自的优缺点?
方法1: %%gen_server:部分call_back function. -define(TIME,1000). init([]) –> erlang:send_after(?TIME,s ...
- .net core i上 K8S(六).netcore程序的service网络代理模式
上一章我们讲了pod的hostip模式,但在生产环境中,我们都是通过service来访问k8s集群的,service有两种模式来暴漏端口,今天我们来分享一下 1.clusterIP模式 我们在创建se ...
- Tomcat开机启动设置
omcat开机启动设置 1.修改/etc/rc.d/rc.local,使用vi /etc/rc.d/rc.local 命令2.在/etc/rc.d/rc.local文件最后添加下面两行脚本 expor ...
- 理解图像Garbor和HOG特征的提取方法及实例应用
前言:今天接触到了这两个特征,看了课本和博客后很蒙蔽,没有理解这两个特征,本篇博客的目的是只是参考其他的博客总结这两个特征,如果未来能研究和工作领域是这方面的话再回来自己研学,如有错误也欢迎指出. G ...
- day11学python 多线程+queue
多线程+queue 两种定义线程方法 1调用threading.Thread(target=目标函数,args=(目标函数的传输内容))(简洁方便) 2创建一个类继承与(threading.Threa ...
- css3动画(animation)效果1-漂浮的白云
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- View-Controller-Containment
willMove(toParentViewController:) 调用时机 调用addChildViewController(_:)以钱会被自动调用 调用removeFromParentViewCo ...
- CentOS6.9 ARM虚拟机扩容系统磁盘
由于扩容磁盘的操作非同小可,一旦哪一步出现问题,就会导致分区损坏,数据丢失等一系列严重的问题,因此建议:在进行虚拟机分区扩容之前,一定要备份重要数据文件,并且先在测试机上验证以下步骤,再应用于您的生产 ...