- 浏览: 27818 次
- 性别:
- 来自: 北京
-
文章列表
单例模式
核心作用
保证一个类中只有一个实例,并且提供一个访问该实例的全局访问点
项目中的配置文件,一般也只有一个对象,没必要每次都都new一遍,配置文件不容易改变
Spring中bean的加载,以及控制器对象也是单例模式
单例模式五种实现方式
饿汗式:编程安全,调用效率高。但是不能延时加载
懒汉式:线程安全,调用效率不高,但是可以延时加载
双重检测锁式(由于JVM底层内部模型原因,偶尔出现问题,不建议使用)
静态内部类式:线程安全,调用效率高,但是可以延时加载
枚举单例:线程安全,调用效率高,不能延时加载
代码
饿汗式 :线程安全的,类初 ...
设计模式之桥接模式bridge
- 博客分类:
- 设计模式
设计模式之桥接模式bridge
场景
商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?
这个场景中有两个变化维度:电脑类型、电脑品牌
多层继承结构实现问题
扩展性问题(个数膨胀问题)
如果要增加一个新的电脑类型智能手机,则要增加各个品牌下面的类
如果要增加一个新的品牌,也要增加各种电脑类型的类
违反单一职责原则
一个类:联想笔记本,有两个引起这个类变化的原因
代码示例
public interface Computer {
void sale();
}
class Desktop impl ...
设计模式之外观模式Facade
- 博客分类:
- 设计模式
外观模式
核心
为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用
代码
public class Client {
//服务员直接就给充好咖啡,放到面前。这就是享受生活
public static void main(String[] args)
{
Waiter wait = new Waiter();
wait.fill();
}
}
//拿铁咖啡
class CafeLatte {
public void Fill() {
...
设计模式之备忘录模式memento
- 博客分类:
- 设计模式
备忘录模式
就是保存某个对象内部状态的拷贝,这样以后就可以将对象恢复到原先的状态
结构
源发器类originator:就是我们的业务模型,它本身可能有非常多的字段(或叫做变量)。一个字段的值发生了改变,我们可以认为Originator的状态就发生了变化。Originator里面有一个IMemento类型的字段用来记录状态的变化(它相当于一个记事本,用来备忘的)
备忘录类Memento:IMemento聚合与Caretaker
负责人类CareTake :用来决定什么时候将IMemento(备忘录)对象中的状态还原到Originator(原发器)中
IMemento( ...
设计模式之装饰者模式Decorator
- 博客分类:
- 设计模式
装饰者模式
职责
动态的为一个对象增加新的功能装饰模式是一种用于代替继承的技术,无须通过类继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀
装饰者模式隐含的是通过一条条装饰链去实现具体对象,每一条装饰链都始于一个Componet对象,每个装饰者对象后面紧跟着另一个装饰者对象,而对象链终于ConcreteComponet对象。
关键字:提高内聚性,面向接口编程,封装变化使用组合,OCP
结构
Component抽象构建角色:真实对象和封装对象有相同的接口,这样客户端对象能够以与真实对象相同的方式 ...
观察者模式与发布/订阅模式区别
- 博客分类:
- 设计模式
观察者模式与发布/订阅模式区别
在翻阅资料的时候,有人把观察者(Observer)模式等同于发布(Publish)/订阅(Subscribe)模式,也有人认为这两种模式还是存在差异,而我认为确实是存在差异的,本质上的区别是调度的地方不同。
观察者模式
比较概念的解释是,目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口。具体观察者和具体目标继承各自的基类,然后具体观察者把自己注册到具体目标里,在具体目标发生变化时候,调度观察者的更新方法。
比如有个“天气中心”的具体目标A,专门监听天气变化,而有个显示天气的界面的观察者B,B就把自己注册到A里,当A触发 ...
java基础之小数问题
- 博客分类:
- java基础
1.关于取整运算
private static void getInt() {
double i=2, j=2.1, k=2.5, m=2.9;
System.out.println("------------------取整-------------------");
System.out.println("舍掉小数取整:Math.floor(2)=" + (int)Math.floor(i));
System.out.println("舍掉小数取整:Math.floor(2.1 ...
设计模式之组合模式composite
- 博客分类:
- 设计模式
组合模式
内容
把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象
核心
抽象构件(Component)角色:定义了叶子和容器构件的共同点
叶子(Leaf)构件角色:无子节点
容器(Composite)构件角色:有容器特征,可以包含子节点
结构图:
组合模式工作流程分析
组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,使得用户在使用时可以一致性的对待容器和叶子
当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员,并调用执行,其中,使用了递归 ...
场景:
内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存
核心
享元对象能够做到共享的关键是区分了内部状态和外部状态
内部状态:可以共享,不会随环境变化而改变
外部状态:不可以共享,会随环境的变化而改变
简单享元结构
抽象享元角色:为具体享元角色规定了必须实现的方法,而外蕴状态就是以参数的形式通过此方法传入。在Java中可以由抽象类、接口来担当。
具体享元角色:实现抽象角色规定的方法。如果存在内蕴状态,就负责为内蕴状态提供存储空间。
享元工厂角色:负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键 ...
设计模式之迭代器模式
- 博客分类:
- 设计模式
迭代器模式
提供一种可以遍历聚合对象的方式,又称cursor模式。迭代器模式(Iterator)就是分离了聚合对象的遍历行为,抽象出一个迭代器来负责这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部数据。
聚合对象:存储数据
迭代器:遍历数据
结构图
聚合抽象类一般以内部类的方式存储
/**
* 定义迭代器接口
*/
public interface MyIterator {
void first();
void next();
boolean hasNext();
boolean isF ...
设计模式之中介者模式
- 博客分类:
- 设计模式
中介者模式
假如没有总经理,下面三个部门,财务部、市场部、研发部,财务部要发工资,让大家核对公司需要跟市场部和研发部都通气,市场部要接个新项目,需要研发部门处理技术,需要财务部出资金,市场部跟各个部门打交道,虽然只有三个部门,但是关系非常乱
假如没有总经理,六个部门的关系非常混乱,实际上公司都总结里,各个部门有什么事情都通报到总经理这里,总经理再通知各个相关部门,我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为如图一第二张图
核心
如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这些 ...
设计模式之命令模式Command
- 博客分类:
- 设计模式
命令模式
命令模式:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。也称之为:动作Action模式、事务transaction模式
结构:
Command抽 ...
linux之vi操作
- 博客分类:
- linux
vi 的基本概念基本上vi可分为三种操作状态,分别是命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode),各模式的功能区分如下:1. Comand mode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode。2. Insert mode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode。3. Last line mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。不过可以把vi简 ...
策略模式
核心
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法,并且有客户端决定调用哪个算法 ;
结构(1) 环境对象Context:该类中实现了对抽象策略中定义的接口或者抽象类的引用。(2) 抽象策略对象接口Strategy:它可由接口或抽象类来实现。(3) 具体策略对象:它封装了实现同不功能的不同算法。
策略模式的好处在于你可以动态的改变对象的 ...
模板方法模式 (Template Method)
特点:
1.定义了一个操作中的算法骨架,而将部分步骤的实现在子类中完成。模板方法模式使得子类可以不 变一个算法的结构即可重定义该算法的某些特定步骤。
2.它是基于继承的代码复用的基本技术,没有关联关系,因此在模板方法模式的类图中,只有继承关系
3.模板方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤
4.代表这些具体逻辑步骤的方法称作基本方法(primitive method);而将这些基本方法汇总起来的方法叫做模板方法(t ...