如何理解“针对接口编程,而不是针对实现编程”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解“针对接口编程,而不是针对实现编程”?相关的知识,希望对你有一定的参考价值。

这是,在听微软的面向对象设计模式与原则一棵的,一句话,理解不深刻,希望网友能详细讲讲,好理解为原则,举例说明也好

通过接口来调用一个类及其方法,而不是直接建立类实体来调用类。
比如将来你要把这个被调用的类换成一个别的实现类时,你就不用去把调用过它的类一个个改掉了,因为它们调的是接口,接口没变,在配置里把接口的实现类换成新的类,就全部都替换掉了
这就是解耦,提高可维护性追问

理解一点点,能不能在详细点,是不是涉及到了工厂模式(我只是听说过)啊

追答

要说清楚工厂模式的话这里版面就不太够了,你可以找下关于设计模式的书或教程什么的,基本上第一个要学的设计模式就是工厂模式,现在有很多教程都能把设计模式说得很简单易懂。

这样做有利于实现工厂模式,但也并不是完整的工厂模式。
反正接口就像个通用遥控器,现在是用来开这台电视机,如果换一台电视机,遥控器不用换,使用方法不变。
没有遥控器,你就得重新学新电视机的按钮用法。

追问

呵呵,你回答的好神速啊,你能否举个简单的Demo,来解释 “针对接口编程,而不是针对实现编程” 这句话呢,感激不尽,呵呵

追答

interface 动物
void 叫();


class 狗 implements 动物
void 叫()
System.out.println("汪");



class 猫 implements 动物
void 叫()
System.out.println("喵");



class test
private 动物 我的宠物;

public static void main()
我的宠物.叫();



现在你可以把我的宠物随便换成狗类或猫类都行了,main方法不用改。
针对实现编程就是
new 狗();
狗.叫();
换了猫再改一次main方法

参考技术A 就是供应商提供了一些库和函数给程序员使用,程序员在编程时直接调用这些函数来完成通用的功能,而不用自己编写这些函数,就是针对接口编程。供应商编写库函数时才是针对的实现编程。

设计模式之策略模式

在关于鸭子的设计中,鸭子有飞行的行为,也有呱呱叫的行为。

橡皮鸭就不会飞,也不会叫,但是绿毛鸭会飞,也会呱呱叫。

设计模式中有几个原则:

1、原则一:找出应用中变化的行为,把它们独立出来,不和那些不需要变化的的代码混合在一起。

变化的就是叫和飞这两个行为,在设计的时候就可以抽离出来。从而设计一个行为的类以及一个制造声音的类。

2、原则二:针对接口编程而不是针对实现编程。

//针对实现编程
Dog d = new Dog();
d.bak();

//针对接口编程
Animal animal = new Dog();
animal.makesound();

子类实例化的动作不在需要在代码中硬性编码,而是在运行的时候才指定具体实现的类。

3、原则三 :多用组合,少用继承。"有一个"比"是一个"更好。原则就是多用组合,少用继承,继承会太死板。

根据抽离出来的鸭子的变化项目,可以抽离出两个行为,FlyBehavior 和 QuackBehavior, 是这两个类。

操作的时候可以这样做,在Duck中添加两个实例的变量,然后

class Duck
{
public:
     FlyBehavior       flyBehavior;
     QuackBehavior  quckBehavior;

public:
    void  performQuack()
   {
      quckBehavior.quack();
   }
    //鸭子对象不亲自处理呱呱叫的行为,而是委托给quckbehavior 引用的对象。
};

3、可以动态的设定行为,让对象有不同的行为。

class Duck
{
public:
     FlyBehavior       flyBehavior;
     QuackBehavior  quckBehavior;

     public setFlyBehavior(FlyBehavior fb)
     {
         flyBehavior = fb;
      }
     public setQuackBehavior(QuackBehavior  qb)
     {
         quckBehavior = qb;
     }
    

public:
    void  performQuack()
   {
        quckBehavior.quack();
   }
    //鸭子对象不亲自处理呱呱叫的行为,而是委托给quckbehavior 引用的对象。

   void performfly()
   {
       flyBehavior.fly();
   }
   //都是委托的关系
};
        

 

正如备注中所说,我们总是花许多时间来系统的维护和变化上。

我们把鸭子的行为想成是一组算法的话,这就是保证了算法的可替换。

策略模式 定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户,在这个例子中,鸭子就是客户,而飞行和叫的行为就是算法,就是这个道理。

 

以上是关于如何理解“针对接口编程,而不是针对实现编程”?的主要内容,如果未能解决你的问题,请参考以下文章

设计原则

设计模式--依赖倒转原则

敏捷开发_依赖导致原则

设计模式详解

设计模式

设计模式的学习:概论