浅析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设计模式二
今天谈的是工厂模式,该模式用于封装和对对象的创建,万物皆对象,那么万物又是产品类,如一个水果厂生产三种水果罐头,我们就可以将这三种水果作为产品类,再定义一个接口用来设定对水果罐头的生成方法,在工厂类中 ...
随机推荐
- Redis学习资料汇总(荐)
Redis学习手册系列: http://www.cnblogs.com/stephen-liu74/category/354125.html Redis详解:sorted sets数据类型及操作-IT ...
- 教程-Win7极速优化20项
1. 加快Windows 7系统启动速度 启动-“msconfig”命令-系统配置-“引导”选项(英文系统是Boot)-点击“高级选项”--勾选“处理器数”和“最大内存”. 2. 加快Wi ...
- 问题-[DelphiXE2]编译程序体积大的问题
作者:cashfly 发布:2012-03-27 15:12 最近准备换Delphi高版本来写程序,以前一直用7.想体验一下新版本带来的便捷,首先有一个体积问题,看下文介绍. 首先,在IDE里可以直接 ...
- nyoj 1022 最少步数【优先队列+广搜】
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...
- nyoj 27 水池数目
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...
- Java 动态生成 复杂 .doc文件
阅读目录 1.word 里面调整好排版,包括你想生成的动态部分,还有一些不用生成的规则性的文字 2. 将 word 文档保存为 xml 3.用 Firstobject free XML edito 打 ...
- Hyper-V介绍
Hyer-v主机是高端虚拟主机用户的最佳选择.您不再受其他用户程序对您造成的影响,您将得到的是更加公平的资源分配,远远低于虚拟主机的故障率.Hyper-V的分区包含两种:父分区和客户分区.Hyper- ...
- 编写高质量代码改善java程序的151个建议——导航开篇
2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...
- 在TextView使用部分颜色文字
/** * change a part of string color. * * @param string * whole string. * @param subString * the sub ...
- 我们应该如何去了解JavaScript引擎的工作原理 系列
http://www.nowamagic.net/librarys/veda/detail/1579