黑马程序员-Java基础:设计模式总结
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
Java基础部分设计模式
一、设计模式概述
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
1.设计模式不是一种方法和技术,而是一种思想
2.设计模式和具体的语言无关,学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低耦合,高内聚,使设计的程序可复用
3.学习设计模式能够促进对面向对象思想的理解,反之亦然。它们相辅相成
二、面向对象思想的设计原则
1.单一职责原则:每个类只实现一种功能,即类的设计应该遵循高内聚,低耦合原则
2.开闭原则:对扩展开放,对修改关闭,类的改动应该通过增加代码来完成,而不是修改原有的代码
3.里氏替换原则:在任何父类出现的地方都可以用它的子类来替代。
4.依赖注入原则:在应用程序中,所有的类如果使用或依赖于其他的类,则应该依赖这些其他类的抽象类,而不是这些其他类的具体类,针对接口编程
5.接口分离原则:不应该强迫程序依赖它们不需要使用的方法。即一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口中。
6.迪米特原则:一个对象对其他对象知道的越少越好,即降低耦合,提高内聚。
三、常见的设计模式简介
1.单例设计模式:确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供。
<1>饿汉式:在类初始化时创建类的实例,无论是否会用到该实例,都会执行创建对象操作
public class Singleton
{//一个私有的静态实例对象private static Singleton singleton = new Singleton();//私有的构造方法,防止程序创建类的对象private Singleton() { }//一个公共方法用于获取类的实例public static Singleton getInstance() {return singleton;}
}
懒汉式:在需要使用该类对象的时候才进行对象的创建
public class Singleton {private static Singleton singleton = null;private Singleton() { }public static Singleton getInstance() {//判断是否已经创建了类的实例,如果已创建,则不再创建。if (singleton== null) {singleton= new Singleton();}return singleton;}
线程安全的单例:防止在多线程情况下出现多个实例。
public class Singleton
{private static Singleton singleton = null;private Singleton() { }public static Singleton getInstance() {if (singleton== null) {synchronized (Singleton.class) {if (singleton== null) {singleton= new Singleton();}}}return singleton;}
}
2.装饰设计模式
装饰设计模式是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。
IO流中的装饰设计模式:
// 文件输入流包装输入流从而对文件进行操作
FileInputStream fis = new FileInputStream("input.txt");
// 缓冲输入流包装文件输入流,以提高文件输入流读取数据的效率
BufferedInputStream bis = new BufferedInputStream(fis);
代码案例:
假设定义一部手机,而手机需要实现很多的功能,但最基本的,应该有打电话的功能,那么定义一个接口如下:
public interface Phone {public void call();
}
// 顺便定义一个具备基本功能的手机类
public class Iphone implements Phone {@Overridepublic void call() {System.out.println("Iphone 可以打电话。");}
}
那么假设由于技术提高,手机又有了新功能,听音乐,那么可以用装饰设计模式思想实现:
public abstract class PhoneDecorate implements Phone {private Phone p;public PhoneDecorate(Phone p) {this.p = p;}@Overridepublic void call() {p.call();System.out.println("Iphone可以听音乐");}
}
此时就可以在不继承Iphone类的基础上,对Iphone的功能进行拓展,相对于继承来说,更加具备灵活性。
3.适配器设计模式
适配器设计模式是指当一个接口有多个功能,而在实现这个接口的时候,仅仅需要实现部分功能,这时候可以定义一个抽象类,给出接口中所有方法的空实现,然后由需要实现该接口中某些方法的具体类来选择性的实现抽象类中的方法。
代码示例:
public interface someMethods {void method1();void method2();void method3();
}public abstract someMethodsAdapter {public void method1() {}public void method2() {}public void method3() {}
}public class A extends someMethodAdapter {@Overridepublic void method1() {System.out.println("实现了method1");}
}
适配器设计模式的优点:让本来不适合使用的接口变得适合使用
缺点:一次只能适配一个类,使用有一定的局限性
黑马程序员-Java基础:设计模式总结相关推荐
- 黑马 程序员——Java基础---流程控制
黑马程序员--Java基础---流程控制 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java提供了两种基本的流程控制结构:分支结构 ...
- 黑马 程序员——Java基础---IO(下)
黑马程序员--Java基础---IO(下) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供 ...
- 黑马程序员--Java基础加强篇
开发工具使用 --------------------------------------------------------------------------------------------- ...
- 黑马程序员-Java基础:面向对象(上)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.面向对象概述 当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高.可随着需求的 ...
- 黑马程序员-Java基础知识预备之Java流程控制与数组
-------- android培训.java培训.期待与您交流!---------- 本博文涉及的主要内容如下: if语句 switch语句 循环结构 循环结构的控制 数组类型 数组在内存中的运行机 ...
- 黑马程序员—java基础总结1
------- android培训.java培训.期待与您交流! ---------- 一:java概述: 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用 ...
- 黑马程序员 — JAVA基础 — 内部类、异常
-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.内部类 1.概念: 把类定义在另一个类的内部,该类就被称为内部类. Eg:把 ...
- 黑马程序员-Java基础加强之枚举
--------- android培训.java培训.期待与您交流!---------- 一.为什么要有枚举? 问题:要定义季节.星期向或性别的变量,该怎么定义?假设用1-4分别表示春.夏.秋.冬,但 ...
- 黑马程序员----------------java基础-----------------Map集合
------- <a href="http://www.itheima.com" target="blank">android培训</a ...
最新文章
- 百炼1001: Exponentiation 解题
- Model share between master view and detail view breaks - didn't find root cause
- 关于JavaScript的浅拷贝和深拷贝
- HALCON示例程序rim.hdev轮圈孔检测提取字符
- 查看电脑重启日志_系统日志看硬盘故障图文教程,电脑日志查看磁盘硬盘坏道问题方法...
- 微信小程序UI组件、开发框架、实用库...
- FreeEIM通讯软件无论是画面风格还是游戏内容
- 使用code::blocks搭建objective-c的IDE开发环境 支持 @interface
- python 插入排序,选择排序
- [转载] 王长松:传统文化与中医养生(东南大学)——第2讲 中医养生方法的源泉(上)...
- 2015061906 - firebug安装和下载(2)
- python之简介及入门
- Unity3D自带案例AngryBots分析(二)——人物动作控制逻辑
- windows下mysql免安装配置
- 微信小程序如何实现登录注册带源码
- 12、加权平均队列(WFQ-Weight Fair Queue)算法
- 【GPS轨道精度】卫星轨道产品的精度及Bernese低轨卫星定轨模型
- MySQL——插入数据
- #717 Cut(倍增)
- CUDA:CUDA转OPENGL的实例
热门文章
- 魅蓝s6 android系统版本,魅蓝S6官方公开稳定版固件系统rom升级更新包:Flyme 7.3.0.1A...
- Python机器学习框架介绍
- 计算机系列助理工程师考试试题,2010助理工程师试题(含答案)
- 代理模式-为别人做嫁衣
- 计算机无法自动休眠,电脑自动休眠怎么取消 无法唤醒又应该怎么办
- Python入门学习——程序设计基本方法
- SGU 103 Traffic Lights(最短路)
- 计算机协会学期计划策划书,新学期计算机协会招新活动策划书
- 居民阅读习惯调查分析
- KernelPanic·并发并行专题