一、单一职责原则
单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。通俗来说,就是互相不相关的属性和方法不要放在一个类中,就好比之前简单工厂模式中介绍的那样,客户端(Customer)应该与工厂(Factory)建立成两个类,当客户想要工厂中的另一种产品时,只需要修改客户端,再或者,工厂想要生产新产品,就只需在工厂类中添加,客户端的类而不需修改。这种只有一个动机的去改变一个类就是单一职责原则。
//产品接口
public interface Product { void run(); } public class Car implements Product {
@Override
public void run() {
System.out.println("drive car");
}
} public class Bicycle implements Product {
@Override
public void run() {
System.out.println("ride on a bicycle");
}
}
//工厂类
public class Factory {
public static Product createProduct(String productName){
Product product = null;
switch (productName){
case "car":
product = new Car();
break;
case "bicycle" :
product = new Bicycle();
break;
}
return product;
}
}
//客户端
public class Customer {
public static void main(String[] args) {
Product car = Factory.createProduct("car");
car.run();
Product bicycle = Factory.createProduct("bicycle");
bicycle.run();
}
}
二、里氏替换原则
里氏替换原则:子类型必须能够替换掉它们的父类型。其实就是在一个程序里,某一个地方使用的是一个父类,那么把父类换成它的子类同样适用。另外子类一般不该重写父类的方法,因为父类的方法一般都是对外公布的接口,是具有不可变性的,你不该将一些不该变化的东西给修改掉。因为一般我们认为,父类可以完成的事情,子类也可以,如果重写父类的方法并且因此出错,将来如果用子类替换父类就会出现问题。
三、依赖倒转原则
1.高层模块不应该依赖低层模块,两个都应该依赖抽象
2.抽象不应该依赖细节,细节应该依赖抽象
通俗来说就是依赖接口编程,就比如上面的简单工厂的例子,我们修改一下使其更直观一些,如果没有Product这个接口(如下所示),我们就必须去调用car.run(),此时必须传入一个Car对象,那么如果以后我们不想用Car想用Bicycle或者其他交通工具呢,那就得新增多个Drive类,所以最好的方法是建立一个Product接口,让所有产品都去实现这个接口,这样,客户端也不必去关心从哪个Drive类中获取所需要的run()方法,直接将想用的交通工具传进工厂类Factory中就可以了。
public class Car {
public void run() {
System.out.println("drive car");
}
} public class Drive{
public static void goHome(Car car){ car.run();
}
} public class Customer {
public static void main(String[] args) {
Car car = new Car();
Drive.goHome(car); }
}
四、接口隔离原则
接口隔离原则:一个接口的行为应该尽可能的小,其实就是接口里的方法一定要是所有实现这个接口的类所能实现的。比如我们定义了一个Car接口,里面有两个方法,驾驶和导航,但是实际情况是并不是所有的汽车都有导航的功能,这样的话没有导航功能的汽车实现这个接口的时候就只能把导航的这个方法空着,所以我们最好把navigation()这个方法从这个接口中去掉,另外单独写一个接口。
public interface Car { //行驶
void run();
//导航
void navigation(); }
public class Car1 implements Car {
@Override
public void run() {
System.out.println("Car1 run ....");
} @Override
public void navigation() { }
}
public class Car2 implements Car {
@Override
public void run() {
System.out.println("Car2 run ...");
} @Override
public void navigation() {
System.out.println("Car2 navigation");
}
}
修改后
public interface CarRun {
//行驶
void run();
} public interface CarNavigation {
//导航
void navigation();
} public class Car1 implements CarRun {
@Override
public void run() {
System.out.println("Car1 run ....");
}
} public class Car2 implements CarRun,CarNavigation {
@Override
public void run() {
System.out.println("Car2 run ...");
} @Override
public void navigation() {
System.out.println("Car2 navigation");
}
}
五、迪米特法则
迪米特法则:如果两个类不比彼此直接通信,那么他们就不应该直接发生作用,它强调的是松耦合,这样的话一个类修改也不会对其他类有太大的影响。
看如下实例有三个类,Car(汽车),Driver(司机),Customer(顾客)和一个测试类,可以看到Customer类中new了一个Car,这就违反了迪米特法则,因为驾驶汽车的活应该交由司机处理,Car类应该是司机内部的类
public class Car {
public void run(){
System.out.println("汽车启动...");
}
} public class Driver {
public void driveCar(Car car){
System.out.println("司机已就绪...");
car.run();
}
} public class Customer {
public void goHome(Driver driver){
Car car = new Car();
driver.driveCar(car);
}
} public class test {
public static void main(String[] args) {
Customer customer = new Customer();
customer.goHome(new Driver());
}
}
修改后的类为
public class Customer {
public void goHome(Driver driver){
driver.driveCar();
}
} public class Driver { Car car = null;
public Driver(Car car){
this.car = car;
}
public void driveCar(){
System.out.println("司机已就绪...");
car.run();
}
} public class test {
public static void main(String[] args) {
Customer customer = new Customer();
Car car = new Car();
customer.goHome(new Driver(car));
}
}
这样的话,Customer就不会知道Car实现的细节,全权交由Driver处理。
六、开放-封闭原则
开放-封闭原则:就是类,函数等应该是可以扩展,但是不能修改。这个原则有两个特征,对于扩展是开放的,对于更改是关闭的。但是事实情况是模块不可能完全封闭的,总会有一些变化,但是这时就需要我们去预测可能发生的变化,然后构造抽象来隔离哪些变化,这样的话以后更改起来就可以保持相对稳定,使一个地方的变化对其他地方的影响尽可能的小。
java设计模式--六大原则的更多相关文章
-
Java设计模式六大原则-2
Java设计模式六大原则-2 做Java程序开发的每天都在使用JDK,Spring,SpringMvc,Mybatis,Netty,MINA等框架,但很少有人懂得背后的原理.即使打开跟下原码也是一头雾 ...
-
Java设计模式六大原则-1
Java设计模式六大原则-1 做Java程序开发的每天都在使用JDK,Spring,SpringMvc,Mybatis,Netty,MINA等框架,但很少有人懂得背后的原理.即使打开跟下原码也是一头雾 ...
-
Java设计模式六大原则
一.单一职责原则 单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小.单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, SRP):一个 ...
-
Java设计模式六大原则之场景应用分析
定义:不要存在多于一个导致类变更的原因. 通俗的说.即一个类仅仅负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而须要改动类T时,有可能会导致原本执行正 ...
-
GOF提出的23种设计模式是哪些 设计模式有创建形、行为形、结构形三种类别 常用的Javascript中常用设计模式的其中17种 详解设计模式六大原则
20151218mark 延伸扩展: -设计模式在很多语言PHP.JAVA.C#.C++.JS等都有各自的使用,但原理是相同的,比如JS常用的Javascript设计模式 -详解设计模式六大原则 设计 ...
-
PHP 设计模式六大原则
http://www.cnblogs.com/yujon/p/5536118.html 设计模式六大原则(1):单一职责原则 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责 设计模 ...
-
zt 设计模式六大原则(3):依赖倒置原则
下面说法对不对? 父类将算法(逻辑)封装起来,子类实现细节:这个就叫DIP(依赖倒置:Dependency Inversion Principles),模板模式就是这个原则的实现.如果在父类中加一个t ...
-
设计模式六大原则——合成/聚合复用原则(CARP)
1.定义 简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承. 2.释义 为什么"要尽量使用合成和聚合.尽量不要使用继承"呢? 这是由于: 第一,继 ...
-
ZT 设计模式六大原则(1):单一职责原则
zt 设计模式六大原则(1):单一职责原则 分类: 设计模式 2012-02-21 09:52 25059人阅读 评论(65) 收藏 举报 设计模式stringclass编程 (THERE SHOUL ...
随机推荐
-
UWP 设备分辨率
之前看了下网上,分辨率都是用webview js拿或者全屏拿宽高,很有局限性. 研究一下.找到个完美的方法: public Size GetDeviceResolution() { Size reso ...
-
Ruby的基本语法-数组
Ruby中数组的实例 1.color=["Red", "Green" ,"Blue"] #数组赋值
-
CUBRID学习笔记 43 insert into
cubrid的中sql查询语法insert into ------ 官方文档是英文的,看不明白可以参看ocracle的同类函数说明.很多都是一样的. INSERT INTO a_tbl1(id) VA ...
-
[百度空间] [原]CImageList支持32位透明位图
32位的位图主要是包含Alpha值(0-255)可以有半透效果的.之前用FreeImage加载 的DIB, CImageList直接绘制会有黑色背景.即便用了ILC_MASK,也创建了mask map ...
-
hdu-5694 BD String(分治)
题目链接: BD String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
-
Bitly缩短网址服务 - Blog透视镜
网站的网址过长或是含有非英文或数字符号,会导致在BBS或者微网志中分享给好友时,产生很多的不方便,Bitly是个缩短网址服务的网站,提供1个短网址转向指定到长网址,免费使用且提供统计报表,例如本篇文章 ...
-
class如何命名更规范
相信写css的人都会遇到下面的问题: 糟糕,怎么命名这个class,好像不太贴切,要是冲突了怎么办,要不要设计成通用一点... 而改别人css代码的时候则会一直有个疑问:这个class到底是只在这个地 ...
-
Less的嵌套规则
Less的嵌套规则 在使用标准CSS时,要为多层嵌套的元素定义样式,要么使用后代选择器从外到内的嵌套定义,要么给这个元素加上类名或 id 来定义.这样的写法虽然很好理解,但维护起来很不方便,因为无法清 ...
-
聚沙成塔-linux 常用命令
批量更改文件后缀名 find . -depth -name "*.scss" -exec sh -c 'mv "$1" "${1%.scss}.les ...
-
微信小程序页面跳转,带参数跳转
1. wx.navigateTo (保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面.) 路径:只能跳转非tabbar路径 参数: 'path?key=v ...