桥梁模式和访问者模式

桥梁模式

将抽象部分与实现部分分离,使得他们两部分可以独立的变化。

有这样一个例子:我们希望可以在windows和Linux下都可以查看BMP、JPEG、GIF类型文件。纯粹的继承就需要2*3个子类而桥梁模式只需要2+3个子类。减少了子类的个数

	 /**
	  * 图像实现类接口
	  */
	 public interface ImageImp{
		 //  TODO
	 }
	 
	 /**
	  * 具体实现类
	  */
	 public class Winimp implements ImageImp {
		 // TODO
	 }
	 
	 public class Unix implements ImageImp {
		 // TODO
	 }
	 /**
	  * 抽象image类型,包含ImageImp接口引用
	  * @author jiahua
	  *
	  */
	 public abstract class Image{
		 protected ImageImp imp;
		 
		 public Image(ImageImp image) {
			 imp = image;
		}
		 
		 public abstract void Method();
	 }
	 /**
	  * 实现类
	  */
	 
	 public class BMPImage extends Image{

		@Override
		public void Method() {
			// 通过抽象父类的setImageImp方法获取操作系统ImageImp类,
			//结合自己BMP图像实现类,完成具体方法
			
		}
	 }
	 public static void main(String[] args) {
		 BMPImage bmp = new BMPImage();      // 具体图像类
		 ImageImp winimp = new Winimp();     //具体系统类
		 
		 bmp.setImageImp(winimp);           //注入
		 bmp.Method();                      //实现图像和系统功能的方法
		
	 }
桥梁模式可以从接口中分离实现功能,使设计更具扩展性

访问者模式

访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式。

下面看一个例子,当车出问题,维修工程师要检查车辆的发动机、车身、轮胎之中一个或多个。

每一个稳定组件对象都包含一个可以让访问者(维修工人)访问的入口,当访问者进入后,在访问者众多的方法中选择一个适合该被访问者的方法,达到区别对待的目的。

	 /**
	  * 访问者
	  * @author jiahua
	  *
	  */
	 public interface Visitor{
		void visit(Body body);        //  检查车身
		void visit(Wheel wheel);      //  检查轮胎
		void visit(Engine engine);    //  发动机
	 }
	 /**
	  * 接受访问的方法
	  * @author jiahua
	  *
	  */
	 
	 public class Wheel{
		 void accept(Visitor visitor) {
			 visitor.visit(this);
		 }
	 }
	 
	 public class Body{
		 void accept(Visitor visitor) {
			 visitor.visit(this);
		 }
	 }
	 
	 public class Engine{
		 void accept(Visitor visitor) {
			 visitor.visit(this);
		 }
	 }
	 /**
	  * 具体访问者
	  * @author jiahua
	  *
	  */
	 public class engineer implements Visitor{
		@Override
		public void visit(Body body) {
			// TODO Auto-generated method stub
		}
		@Override
		public void visit(Wheel wheel) {
			// TODO Auto-generated method stub
		}
		@Override
		public void visit(Engine engine) {
			// TODO Auto-generated method stub
		}
	 }
	 public static void main(String[] args) {
		 Wheel wheel = new Wheel();
		 Visitor visitor = new engineer();
		 wheel.accept(visitor);
		
	 }
访问者模式使增加新的操作变得容易,他可以收集有关联的方法,而分离没有关联的方法,特别适用于分离因为不同原因而变化的事物。

桥梁模式和访问者模式的区别

通过上述两种模式的示例,不难发现这一点。他们都通过将对象传入另一个对象中,完成两个对象结合使用完成功能的目的。

不同的是:访问者更多凸显的是将行为抽象出来,实现行为与数据的结合。而桥梁模式并没有凸显这一点。两种设计模式所属的类别无疑是原因之一。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
25.1 场景问题 25.1.1 扩展客户管理的功能 考虑这样一个应用:扩展客户管理的功能。 既然是扩展功能,那么肯定是已经存在一定的功能了,先看看已有的功能:公司的客户分成两大类,一类是企业客户,一类是个人客户,现有的功能非常简单,就是能让客户提出服务申请。目前的程序结构如25.1所示: 25.1 已有的客户管理程序结构示意 现有的实现很简单,先看看Customer的实现,示例代码如下: /** * 各种客户的父类 */ public abstract class Customer { /** * 客户编号 */ private String customerId; /** * 客户名称 */ private String name; /** * 客户提出服务请求的方法,示意一下 */ public abstract void serviceRequest(); } 接下来看看企业客户的实现示例代码如下: /** * 企业客户 */ public class EnterpriseCustomer extends Customer{ /** * 联系人 */ private String linkman; /** * 联系电话 */ private String linkTelephone; /** * 企业注册地址 */ private String registerAddress; /** * 企业客户提出服务请求的方法,示意一下 */ public void serviceRequest(){ //企业客户提出的具体服务请求 System.out.println(this.getName()+"企业提出服务请求"); } } 再看看个人客户的实现示例代码如下: /** * 个人客户 */ public class PersonalCustomer extends Customer{ /** * 联系电话 */ private String telephone; /** * 年龄 */ private int age; /** * 企业注册地址 */ private String registerAddress; /** * 个人客户提出服务请求的方法,示意一下 */ public void serviceRequest(){ //个人客户提出的具体服务请求 System.out.println("客户"+this.getName()+"提出服务请求"); } } 从上面的实现可以看出来,以前对客户的管理功能是很少的,现在随着业务的发展,需要加强对客户管理的功能,假设现在需要增加如下的功能: 客户对公司产品的偏好分析,针对企业客户和个人客户有不同的分析策略,主要是根据以往购买的历史、潜在购买意向等进行分析,对于企业客户还要添加上客户所在行业的发展趋势、客户的发展预期等的分析。 客户价值分析,针对企业客户和个人客户,有不同的分析方式和策略。主要是根据购买的金额大小、购买的产品和服务的多少、购买的频率等进行分析。 其实除了这些功能,还有很多潜在的功能,只是现在还没有要求实现,比如:针对不同的客户进行需求调查;针对不同的客户进行满意度分析;客户消费预期分析等等。虽然现在没有要求实现,但不排除今后有可能会要求实现。 25.1.2 不用模式的解决方案 要实现上面要求的功能,也不是很困难,一个很基本的想法就是:既然不同类型的客户操作是不同的,那么在不同类型的客户里面分别实现这些功能,不就可以了。 由于这些功能的实现依附于很多其它功能的实现,或者是需要很多其它的业务数据,在示例里面不太好完整的体现其功能实现,都是示意一下,因此提前说明一下。
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值