java设计模式(一)【六大原则】
class Horse {
void ride(){}
}
class WhiteHorse extends Horse {
@Override
public void ride() {
System.out.println("骑白马");
}
}
class BlackHorse extends Horse {
@Override
public void ride() {
System.out.println("骑黑马");
}
}
class Men {
void ride(Horse horse) {
horse.ride();
}
}
class Calculator {
void add(int x,int y) {
System.err.println(x+y);
}
}
class AdvCalculator extends Calculator {
@Override
void add(int x,int y) {
System.out.println(x*y);
}
void sub(int x,int y) {
System.out.println(x-y);
}
}
子类AdvCalculator重写了父类Calculator的add方法,我们可以看出在调用add方法时,期望输出是两者和,但是由于子类复写了add方法,所以我们调用子类的add的时候获得的结果是两者的乘积,和期望不符合。
实际上这个原则隐藏了这样一层约束,当类B继承类A时,不能改变父类的规范和约束(不随意重写父类已经实现好的方法),如果子类随意修改这些契约,那么会对整个继承体系造成破坏。
class WhiteHorse {
void ride() {
System.out.println("骑白马");
}
}
class Men {
void ride(WhiteHorse horse) {
horse.ride();
}
}
class BlackHorse {
void ride() {
System.out.println("骑黑马");
}
}
interface Horse{
void ride();
}
class Men {
void ride(Horse horse) {
horse.ride();
}
}
class WhiteHorse implements Horse {
public void ride() {
System.out.println("骑白马");
}
}
class BlackHorse implements Horse {
public void ride() {
System.out.println("骑黑马");
}
}

class Platoon {
private Squad[] squads;
void gather() {
int count = 0;
for (Squad squad : squads) {
for (Man man : squad.gather()) {
count += man.gather();
}
}
System.out.println("一个排一共有"+count+"名士兵");
}
}
class Squad {
private Man[] mans;
Man[] gather() {
return this.mans;
}
}
class Man {
int gather() {
return 1;
}
}
class Platoon {
private Squad[] squads;
void gather() {
int count = 0;
for (Squad squad : squads) {
count += squad.gather();
}
System.out.println("一个排一共有"+count+"名士兵");
}
}
class Squad {
private Man[] mans;
int gather() {
int count = 0;
for (Man man : mans) {
count += man.gather();
}
return count;
}
}
class Man {
int gather() {
return 1;
}
}
其实,迪米特法则谈论的就是对象之间的信息流量、流向以及信息的影响的控制。将实现的细节隐藏起来,让模块之间只通过api交互,这实际上就是信息的隐藏。它可以使模块之间脱耦,允许模块独立开发维护等一系列好处。所以在设计类的时候最好遵循以下几点
1、优先考虑将类设置成不变类
2、尽量降低一个类的访问权限
3、尽量降低成员的访问权限
--------------------------------------------------------end--------------------------------------------------------
作者:燃点null
出处:http://www.cnblogs.com/lightnull/
本文为燃点null原创,欢迎转载,但未经同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
java设计模式(一)【六大原则】的更多相关文章
- Java 设计模式(二)-六大原则
Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...
- C#之设计模式之六大原则(转载)
设计模式之六大原则(转载) 关于设计模式的六大设计原则的资料网上很多,但是很多地方解释地都太过于笼统化,我也找了很多资料来看,发现CSDN上有几篇关于设计模式的六大原则讲述的比较通俗易懂,因此转载过来 ...
- 设计模式之六大原则——接口隔离原则(ISP)
设计模式之六大原则——接口隔离原则(ISP) 转载于:http://www.cnblogs.com/muzongyan/archive/2010/08/04/1792528.html 接口隔离原则 ...
- java中的设计模式及其六大原则
设计模式分类: 一共分为3大类:创造型模式.结构型模式.行为型模式. 创造型模式:工厂方法(FactoryMethod).抽象工厂模式(AbstractFactory).建造者模式(Builder). ...
- JAVA面向对象-----java面向对象的六大原则
现在编程的主流语言基本上都是面向对象的.如C#,C++,JAVA.我们在使用时,已经构造了一个个的类.但是往往由于我们在类内部或外部的设计上存在种 种问题,导致尽管是面向对象的语言,却是面向过程的逻辑 ...
- java设计模式之七大原则
java设计模式 以下内容为本人的学习笔记,如需要转载,请声明原文链接 https://www.cnblogs.com/lyh1024/p/16724932.html 设计模式 1.设计模式的目的 ...
- .NET 设计模式的六大原则理论知识
1. 单一职责原则(SRP)(Single Responsibility Principle)2. 里氏替换原则(LSP)(Liskov Substitution Principle)3. 依赖倒置原 ...
- java对象的六大原则
对象的六大原则: 1.单一职责原则(Single Responsibility Principle SRP) 2.开闭原则(Open Close Principle OCP) 3.里氏替换原则(Li ...
- 0 Java实现 一篇文章说尽设计模式之六大原则
我们知道,设计模式很有用,学好设计模式不但能让你写出更简洁,优雅的代码,还能使得代码的结构更清晰,也更有利于扩展 当然设计模式也不是万能的,一成不变的.设计模式只是前人总结出来的一种经验,一种特定问题 ...
- Java设计模式学习——设计原则
第一章 设计原则 1.开闭原则 一个软件实体,像类,模块,函数应该对扩展开放,对修改关闭 在设计的时候,要时刻考虑,让这个类尽量的好,写好了就不要去修改.如果有新的需求来,在增加一个类就完事了,原来的 ...
随机推荐
- MD5和SHA加密实现
@Test public void TestMD5AndSHA() throws NoSuchAlgorithmException { String MD5=Md5("123456" ...
- Elasticsearch重要文章之四:监控每个节点(ThreadPool部分)
http://zhaoyanblog.com/archives/754.html ThreadPool部分 Elasticsearch 内部使用了线程池,通过这些线程池之间的合作完成工作,在需要时传递 ...
- Linux系统文件权限管理(6)
Linux操作系统是多任务(Multi-tasks)多用户(Multi-users)分时操作系统,linux操作系统的用户就是让我们登录到linux的权限,每当我们使用用户名登录操作系统时,linux ...
- MariaDB 存储过程与函数(10)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...
- MariaDB 库的基本操作(2)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...
- Redis---quickList(快速列表)
1. 概述 考虑到链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节 (64bit 系统的指针是 8 个字节),另外每个节点的内存都是单独分配,会加剧内存的碎片化,影响内存管理 ...
- Service Fabric学习-从helloworld开始(无状态服务)
原先做服务器程序, 都是部署在xx云上, 也没理解云是个啥, 不就是个服务器(虚拟机)租赁商吗? 好吧, 其实这个是IaaS, 而接下来要学习的ServiceFabric(以下简称SF)是PaaS. ...
- 二分查找的实现(java版本)
一.二分法查找的定义 依次将所查找数据与中心数据对比,根据大小调整数据边界二.二分查找的条件 数组必须排序三.二分查找的原理 四.二分法查找的代码 /* * 从数组当中找到4所在的索引: * {2,4 ...
- Spark中的常用算子
更多有用的例子和算子讲解参见: http://homepage.cs.latrobe.edu.au/zhe/ZhenHeSparkRDDAPIExamples.html map是对每个元素操作, ma ...
- Redis笔记(2)单机数据库实现
1.前言 上节总结了一下redis的数据结构和对象构成,本章介绍redis数据库一个基本面貌,是如何设计的. 2.数据库 服务器结构redisServer: redisDb *db: 一个数组,保存服 ...