`
wuhongjun
  • 浏览: 6842 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Java设计模式之单向适配器模式

阅读更多

    通常我们会遇到这样的问题,假如某两个互不相关的类:

class A
{
    public a()
   {
       System.out.println("计算打字速度!");
   }
}
class B
{
    public b()
   {
       System.out.println("放音乐!");
   }
}

 问题是这样的:在调用A类的方法a()时,同时必须调用B类的b()方法,在不改变源代码的情况下,你该怎么实现?

 

其实要解决这种问题方法很多,我们在实际情况也经常会遇到,我的方法就是利用适配器模式来解决!

第一种方法:

         定义一个新的类SubA继承A,我们调用的时候直接调用A类的子类(即SubA),代码如下:

 

class A
{
    public a()
   {
       System.out.println("计算打字速度!");
   }
}
class B
{
    public b()
   {
       System.out.println("放音乐!");
   }
}
class SubA extends A
{
      //在这里重写A类的a方法
     public a()
      {
             //先调用父方法
             super.a();
            //new一个B的实例
            B b=new B();
            //调用b的b()方法,这样就新增了一个"放音乐"的新方法啦!
            b.b();
      }
}
/*
 *测试类
 */
public class Test
{
       public static void main(String args[])
      {
               SubA a=new SubA();
               //这里调用的时候同时调用了B类的b方法,即可解决问题。
               a.a();
      }
}

 不知道大家有没有发现,如果我们客户需求有变更,还需要加一个功能---"加入表情",那我们即不是又需要改SubA类a方法的代码?不是说不准改代码吗?那我们该怎么办呢?头痛。。。。幸好。。。。。。Java中还有接口呢?我们可以利用接口来实现这样的功能。

第二种方法:

我们把所要加的功能抽象出来放到接口里。就像这样

interface Manager
{
    public abstract void extendFun();
}

 

 extendFun()方法其实放的就是客户所需求的"功能的定义";接口必须要实现它,所以定义如下类

class A
{
    public a()
   {
       System.out.println("计算打字速度!");
   }
}
//功能接口
interface Manager
{
     public abstract void extendFun();
}
//类B实现了Manager接口
class B implements Manager
{
     //原始方法都不要,直接实现接口里的extendFun()方法
//    public b()
//  {
//       System.out.println("放音乐!");
//  }
    public void extendFun()
   {
           System.out.println("放音乐!");
   }
   
}
//类C实现了Manager接口
class C implements Manager
{
//    public c()
//   {
//       System.out.println("加入了表情!");
//   }
    public void extendFun()
    {
           System.out.println("加入了表情!");
    }
}

class SubA extends A
{
     //声明一个Manager接口属性
     private Manager manager;
     //这里定义一个构造函数,传入接口,只要是实现了Manager接口的类都
   //可以通过构造方法传入进来,你也可以通过Spring来注入具体实现类   
    public SubA(Manager manager)
     {
         this.manager=manager;
     }
     //覆盖父类的方法
    public a()
      {
         super.a();
        //调用接口的extendFun();方法,其实调用的就是实现接口的类的
     //extendFun()方法。至此就给A类加入了新的功能了。
     manager.extendFun();
     }   
}
public class Test
{
      public static void main(String args[])
    {
          B b=new B();
         //通过构造函数传入接口实现Manager接口的实现类
          SubA a=new SubA(b);
         a.a();//调用a方法
    }
}

不知道大家有没有弄明白,因为个人水平有限,语言表达不是很顺。还请各位见谅!!!!!!!

分享到:
评论

相关推荐

    JAVA模式与设计概念总结

    Java模式与设计概念是软件开发中的核心思想,它们帮助我们构建可维护、可扩展且高效的代码。这些概念包括类与类之间的各种关系,如继承、关联、聚合和合成,以及设计原则,如“开-闭”原则、里氏代换原则、依赖倒转...

    设计模式介绍,欢迎下载

    本文将重点介绍工厂设计模式以及策略模式和适配器模式。 ### 工厂设计模式概述 虽然提供的内容中未直接提及工厂设计模式的具体内容,但作为一种重要的创建型设计模式,工厂模式旨在提供一种创建对象的最佳方式。...

    java常用数据结构及算法集锦

    适配器模式 装饰模式 组合模式 享元模式 桥接模式 行为模式 观察者模式 模板方法模式 策略模式 命令模式 调停者模式 备忘录模式 解释器模式 迭代器模式 状态模式 责任链模式 访问者模式 结构与算法 基础概念 稀疏...

    java及java EE面试大全

    Java及Java EE面试大全主要涵盖了Java语言的基础知识、数据结构、算法、设计模式以及Java EE的相关概念。以下是对这些知识点的详细阐述: 1. **数据结构**: - **链表**:链表是一种线性数据结构,其中的元素不是...

    java学习心得

    1. **MVC概念**:MVC代表Model-View-Controller,是一种常用的设计模式,用于将输入、处理和输出强制分开。 2. **MVC各组成部分**: - **模型(Model)**:负责业务逻辑和数据处理,通常以JavaBean的形式存在。 - **...

    超级有影响力霸气的Java面试题大全文档

    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 19、同步和异步有何异同,在什么情况下分别使用他们?举例说明。  如果数据将在线程间共享。例如正在写的数据以后可能...

    design-pattern:完成任务的方式,只是方程式,算法,过程或统计模型。与软件语言无关,它们以以下方式实现

    不过,在构建大型Web应用时,前端框架如React或Vue.js中会运用到设计模式的概念,例如状态管理的单向数据流(如React的Flux或Vue的Vuex),这其实是一种行为型设计模式的体现。 在"design-pattern-master"这个...

    小米2020软件开发工程师笔试题一.docx

    1. 设计模式:装饰器模式、适配器模式、单列模式、简单工厂模式。 * 装饰器模式:不会更改被封装对象的接口定义。 * 适配器模式:目的是不改变被适配对象的接口定义。 * 单列模式:饿汉方式实现的单列模式不能被...

    基于ssm+vue社区团购系统.zip

    2. SpringMVC:学习控制器(Controller)、模型(Model)、视图(View)和适配器(Adapter)的设计模式。 3. MyBatis:掌握SQL映射文件的编写,动态SQL的使用,以及与Java对象的映射配置。 4. Vue.js:学习Vue的基本...

    spring integration同步数据库数据

    2. **事件驱动的模型**:Spring Integration基于消息驱动的设计模式,因此JDBC适配器会生成一个消息,每个消息代表数据库查询的结果行。这些消息可以被其他处理链(如服务 activator 或 transformer)消费,进行...

    WCFoverJMS(Activ....docx

    在设计接口时,我们考虑两种模式:Request/Response模式(请求-响应)和OneWay模式(单向)。为了实现这些接口,我们将使用BasicHttpBinding作为基础绑定,确保跨平台兼容性。 在C++ Server项目中,我们利用gSoap...

    基于ssm+vue高校学生实习管理系统.zip

    2. **SpringMVC**:学习控制器、模型、视图和适配器模式,以及HTTP请求和响应的处理。 3. **MyBatis**:掌握XML和注解方式的SQL映射,以及如何执行增删改查操作。 4. **Vue.js**:学习组件化开发、单向数据流、计算...

    ice.rar_ICE_ICE 开发_ICE CORBA_corba_ice接口

    ICE支持多种通信模式,包括同步、异步、单向和事件驱动,可以根据应用需求选择最合适的通信方式。此外,ICE还提供了强大的安全特性,如身份验证、授权和加密,确保了分布式系统间的通信安全。 Ice.ppt很可能是一个...

    JBI规范.docx

    3. **消息交换(Message Exchange)**:JBI定义了多种消息交换模式,如请求-响应、单向(in-only)等,以适应不同场景下的通信需求。 4. **组件安装(Assembly)**:允许动态或静态地向运行时环境添加可执行的软件...

    2021-2022计算机二级等级考试试题及答案No.14019.docx

    12. ComponentAdapter是Java AWT事件适配器类,但它不属于特定类型的事件适配器,例如MouseListener、KeyListener等。 13. 在软件生命周期的需求分析阶段,能够准确确定软件系统所需功能和行为。 14. 表达式Len(...

    springmvc+extjs

    - **MVVM模式**:类似于React的单向数据流,帮助保持应用状态的清晰。 - **Ajax通信**:内置的Ajax功能,方便与服务器进行异步交互。 - **布局管理**:提供多种布局方式,满足不同页面布局需求。 3. **整合...

    基于SpringBoot + Vue 的WebSocket联网五子棋项目源码

    1. **SpringBoot**: SpringBoot是Spring框架的一个扩展,它简化了创建独立、生产就绪的Java应用。它集成了大量常用的第三方库配置,如数据访问、安全、WebSocket等,使得开发者能够快速地搭建应用。 2. **WebSocket...

Global site tag (gtag.js) - Google Analytics