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方法
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值