浅析JAVA设计模式(二)
2. 里氏替换原则:LSP(Liskov Substitution Principle)里氏替换原则,定义为只要父类出现的地方子类就可以出现,而且用子类替换后,程序也不会出现问题,使用者根本不用关心是父类还是子类。这也是我们java继承特性的一个表现。
下面用个实际项目中遇到的一个简单的需求:现在有A类产品需要调用method1(),B类产品也需要调用method(),同样C类产品也需要调用method(),但是我们需要直接让D这个人去处理这个Method(),那么我们可以这样设计一个抽象类AbstractB(或者接口)。
AbstractB类代码如下:
public abstract class AbstractB {
//实现逻辑
public abstract void Method();
}
下面A,B,C类分别继承抽象类AbstractB:
public class A extends AbstractB {
@Override
public void Method() {
System.out.println("A实现Method....");
}
}
public class B extends AbstractB {
@Override
public void Method() {
System.out.println("B实现Method....");
}
}
public class C extends AbstractB {
@Override
public void Method() {
System.out.println("C实现Method....");
}
}
设计D类
@SuppressWarnings("unused")
public class D {
public AbstractB abstractObj;
public void setRealObj(AbstractB realObj){
this.abstractObj = abstractObj;
}
public void invocateMethod(){
//方法调用
abstractObj.Method();
}
}
注意:在类中调用其他类对象的时候,必须要使用父类或者接口,如果没有的话,则说明违背了LSP原则。
写个测试类:
public class test {
public static void main(String[] aa){
D d = new D();
d.setRealObj(new A());
/*d.setRealObj(new B());
d.setRealObj(new C());*/
d.invocateMethod();
}
}
上面的setRealObj方法中,传递一个子类实体,这里制定的是父类类型,这里我们不用关心传递的是父类还是子类。相反如果参数类型为子类,传递的一个父类的类型,这时就不一定适用。就与里氏替换原则违背,如果现在有个E产品也需要实现Method方法,只需再实现抽象类AbstractB即可。
里氏替换原则的目的就在于增强程序的健壮性,便于系统的兼容性。及时增加子类也可以很好的满足要求继续执行。
3、依赖倒转原则:DIP(Dependence Inversion Principle)这个是开闭原则的基础,具体内容:面向接口编程(OOD),依赖于抽象而不依赖于具体,用到具体类时,不与具体类交互,而与具体类的上层接口或者抽象类交互。
这个其实与LSP挺相似的。都是尽量与上层交互。看段代码说话。
比如说司机开汽车,车子有宝马,有奔驰,有其他的型号的汽车。
定一个司机接口Driver
public interface IDriver {
public void drive();//开车
}
定义一个汽车接口Car
public interface ICar {
public void run();//汽车奔跑
}
定义宝马,奔驰实现汽车接口
public class Benz implements ICar {
@Override
public void run() {
System.out.println("奔驰跑起来....");
}
}
public class Bmw implements ICar {
@Override
public void run() {
System.out.println("宝马跑起来....");
}
}
实现司机接口:
public class Driver implements IDriver {
public ICar car;
//这里用构造函数传递依赖对象
public Driver(ICar _car){
this.car = _car;
}
@Override
public void drive() {
this.car.run();
}
}
实现依赖注入还有另外两种方式。seter方法注入、接口声明传递。
依赖倒置本质就是通过抽象类或接口实现各个类或者模块彼此独立化,实现模块间的松耦合。我们尽量遵循以下几点:
第一:每个类尽量都有接口或者抽象类或者两者都有。
第二:变量的表面类型尽量是接口或者抽象类。
第三:尽量不要具体类派生,尽量不要复写基类的方法。
第四:结合里氏替换原则使用。个人感觉两者其实意义上有很大的相同。
通俗的讲,倒置的概念我认为就是用抽象代替细节实在,这就是倒置。
浅析JAVA设计模式(二)的更多相关文章
- 浅析JAVA设计模式之工厂模式(二)
1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- Java 设计模式(二)-六大原则
Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...
- 浅析JAVA设计模式(一)
第一写技术博客,只是想把自己一天天积累的东西与大家分享.今天在看<大型网站架构和java中间件>这本书时,其中提到代理模式的动态代理.作为java中间件的一个重要基础,我觉的有必要整理和分 ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- 浅析JAVA设计模式(三)
4.接口隔离原则: ISP(Interface Segregation Principle) 客户端不应该依赖它不需要的接口,或者说类的依赖的关系应该建立在最小的接口上.举个例子,直接上代码: 1 ...
- 阿里架构师浅析Java设计模式之虚拟代理模式
虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成,应用启动 ...
- 浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象
最近在着手重构一个java UI桌面项目,发现这个项目在一开始的时候由于需求不明确,以及开发人员对swing框架不熟悉等问题造成了页面代码混乱的情况:为了能够在各个类里都可以拿到其他类的引用去进行相应 ...
- Java设计模式二
今天谈的是工厂模式,该模式用于封装和对对象的创建,万物皆对象,那么万物又是产品类,如一个水果厂生产三种水果罐头,我们就可以将这三种水果作为产品类,再定义一个接口用来设定对水果罐头的生成方法,在工厂类中 ...
随机推荐
- HDU4763 - Theme Section(KMP)
题目描述 给定一个字符串S,要求你找到一个最长的子串,它既是S的前缀,也是S的后缀,并且在S的内部也出现过(非端点) 题解 CF原题不解释....http://codeforces.com/probl ...
- ehcache在windows下使用RMI同步时出现的问题
问题 最近的项目由于OP分配的机器没有配Redis或Mem,为了解决tomcat的集群问题,项目使用了Ehcache作为缓存.Ehcache使用RMI进行同步,但在本地测试时出现了缓存未同步的问题.最 ...
- 七行jquery代码实现图片渐变切换【兼容ie6+、 Chrome、 Firefox】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- openssl pem转cer
openssl x509 -in cert/2120.pem -outform der -out cert/ios20170109.cer
- Oracle Tnsping慢
http://www.linuxidc.com/Linux/2014-02/96167.htm http://www.askmaclean.com/archives/dns%E8%AE%BE%E7%B ...
- Win+R指令(1)
CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本)1. appwiz.cpl:程序和功能 2. calc:启动计算器 3. certmgr. ...
- JS获取浏览器可视区域尺寸
本文所说的是浏览器窗口的可视区域大小,不是浏览器窗口大小,也非页面尺寸. 在没有声明DOCTYPE的IE中,浏览器显示窗口大小只能以下获取: document.body.offsetWidth doc ...
- 自定义Dictionary支持线程安全
本文转载:http://www.cnblogs.com/kiddo/archive/2008/09/25/1299089.html 我们说一个数据结构是线程安全指的是同一时间只有一个线程可以改写它.这 ...
- IOS程序内发短信 MFMessageComposeViewController
文章转载地址:http://www.headsky.org/?p=63 iOS4.0新加入了MFMessageComposeViewController和MFMessageComposeViewCon ...
- [ATL/WTL]_[0基础]_[CBitmap复制图片-截取图片-平铺图片]
场景: 1.当你须要截取图片部分区域作为某个控件的背景. 2.须要平铺图片到一个大区域让他自己主动放大时. 3.或者须要合并图片时. 代码: CDC sdc; CDC ddc; sdc.CreateC ...