ICustomer customer = new Customer(); 这样写,你只能把Customer当做ICustomer服务的提供者,那么你只能使用ICustomer声明的服务。 Customer customer = new Customer(); 这样写,那么你就能使用Customer类中所有的公开服务,此时你把它当做Customer来用。 区别其实没啥,这两种写法都行,不存在什么设计、重用、面向接口之类的东西,这些东西是在设计结构时候定的,跟这里如何实例化一个类没有什么关系。比如你声明了一个ArrayList list = new ArrayList();你照样能把这个对象引用丢给参数列表类型为List的方法。
设计模式基础中的设计原则:依赖倒置、空值反转、接口隔离都需要接口、抽象类的支持。但是如果是见到直接写成ICustomer customer = new Customer();不考虑上下文的情况下,好像没有什么特别的,也有些多此一举,因为已经将ICustomer与Customer耦合在了一起。或许这只是一种好习惯而已。
这样写,你只能把Customer当做ICustomer服务的提供者,那么你只能使用ICustomer声明的服务。
Customer customer = new Customer();
这样写,那么你就能使用Customer类中所有的公开服务,此时你把它当做Customer来用。
区别其实没啥,这两种写法都行,不存在什么设计、重用、面向接口之类的东西,这些东西是在设计结构时候定的,跟这里如何实例化一个类没有什么关系。比如你声明了一个ArrayList list = new ArrayList();你照样能把这个对象引用丢给参数列表类型为List的方法。
做一个控制一些对象的管理器,对象可能是一个活动的角色,一个AI控制的NPC,或者一个自由移动的宠物,
他们都可以实现自同一个接口IChar
管理器中可以直接HashMap<Integer, IChar>来存储所有这些对象,当需要对某个对象操作时候都可以从这一个哈希表中处理,不用给每种做独立的集合了
而是对于ICustomer customer = new Customer();
这样的写法耿耿于怀。这个东西如果不放在函数里写而是作为参数,那就好理解了吧。
例:
public void doOrder(ICustomer customer) {
custom.order();
}
其实个人觉得这么做就是强调他们属于某个集合,有着共同的行为。
2、如果修正这个错误后,这个写法符合面向接口编程的原则:
只暴露接口中定义的行为给外界调用,子类中新增的行为会被隐藏,提高封装性、安全性。
可以灵活切换子类,如将子类配置到属性文件或xml文件中,避免程序再次编译,提高效率。
用接口来实例类 便于以后管理 程序越大面向接口的优点就越明显