- 浏览: 65729 次
- 性别:
- 来自: 上海
最新评论
-
java苹果+番茄:
已经修改,感谢大家提的意见;有一年多没进来了,很惭愧;以后一定 ...
java设计模式笔记链接地址汇总 -
youthon:
命令(Command)模式【行为模式第九篇】的链接应为http ...
java设计模式笔记链接地址汇总 -
youthon:
你给的链接只有你自己才能打开,你改改吧
java设计模式笔记链接地址汇总 -
shaozhi_jinni:
[b][/b][i][/i][u][/u]引用引用
[img ...
模板方法(Template Method)模式【行为模式第十篇】 -
Tank03:
慢慢的走~
android开发学习中(已经学会了几个小玩意),兴趣大增
不变(Immutable)模式
一个对象的状态在对象被创建之后就不再变化,这就是不变模式。
一、不变模式有两种模式
1、弱不变模式
一个类的实例的状态是不可变化的,但是这个类的子类的实例具有可能会变化的状态。这样的类符合弱不变模式的定义。
要实现弱不变模式,一个类必须满足下面条件:
第一、所考虑的对象没有任何方法会修改对象的状态,这样一来,当对象的构造子将对象的状态初始化之后,
对象的状态便不再改变。
第二、所有的属性都应当是私有的。不要声明任何的公共的属性,以防客户端对象直接修改任何的内部状态。
第三、这个对象所引用到的其它对象如果是可变对象的话,必须设法限制外界对这些可变对象的访问,以防止外界修改
这些对象。如果可能,应当尽量在不变对象内部初始化这些被引用到的对象,而不要在客户端初始化,然后再
传入到不变对象内部来。如果某个可变对象必须在客户端初始化,然后再传入到不变对象里的话,就应当考虑
在不变对象初始化的时候,将这个可变对象复制一份,而不再使用原来的拷贝。
弱不变模式的缺点是:
第一、一个弱不变对象的自对象可以是可变对象;换言之,一个弱不变对象的子对象可能是可变的
第二、这个可变的子对象可能可以修改父对象的状态,从而可能会允许外界修改父对象的状态。
2、强不变模式
一个类的实例的状态不会改变,同时它的子类的实例也具有不可变化的状态。这样的类符合强不变模式。
要实现强不变模式,一个类必须首先满足弱不变模式所要求的所有条件,并且还要满足下面的条件之一:
第一、所考虑的类所有的方法都应当是final:这样这个类的子类不能够置换掉此类的方法
第二、这个类本身就是final的,那么这个类就不可能会有子类,从而也就不可能有被子类修改的问题。593P
二、不变模式的优缺点
不变模式有很明显的有点:
1、因为不能修改一个不变对象的状态,所以可以避免由此引起的不必要的程序错误;换言之,一个不变模式的对象要比可变的
对象更加容易维护。
2、因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,
这样就可以省掉处理同步化的开销。一个不变对象可以自由地被不同的客户端共享。
不变模式唯一的缺点是:
一旦需要修改一个不变对象的状态,就只好创建一个新的同类对象。在需要濒繁修改不变对象的环境里,会有大量的不变对象
作为中间结果被创建出来,再被java语言的垃圾回收器收集走。这是一种资源上的浪费。
三、一个用来说明不变模式的复数类例子
一个对象的状态在对象被创建之后就不再变化,这就是不变模式。
一、不变模式有两种模式
1、弱不变模式
一个类的实例的状态是不可变化的,但是这个类的子类的实例具有可能会变化的状态。这样的类符合弱不变模式的定义。
要实现弱不变模式,一个类必须满足下面条件:
第一、所考虑的对象没有任何方法会修改对象的状态,这样一来,当对象的构造子将对象的状态初始化之后,
对象的状态便不再改变。
第二、所有的属性都应当是私有的。不要声明任何的公共的属性,以防客户端对象直接修改任何的内部状态。
第三、这个对象所引用到的其它对象如果是可变对象的话,必须设法限制外界对这些可变对象的访问,以防止外界修改
这些对象。如果可能,应当尽量在不变对象内部初始化这些被引用到的对象,而不要在客户端初始化,然后再
传入到不变对象内部来。如果某个可变对象必须在客户端初始化,然后再传入到不变对象里的话,就应当考虑
在不变对象初始化的时候,将这个可变对象复制一份,而不再使用原来的拷贝。
弱不变模式的缺点是:
第一、一个弱不变对象的自对象可以是可变对象;换言之,一个弱不变对象的子对象可能是可变的
第二、这个可变的子对象可能可以修改父对象的状态,从而可能会允许外界修改父对象的状态。
2、强不变模式
一个类的实例的状态不会改变,同时它的子类的实例也具有不可变化的状态。这样的类符合强不变模式。
要实现强不变模式,一个类必须首先满足弱不变模式所要求的所有条件,并且还要满足下面的条件之一:
第一、所考虑的类所有的方法都应当是final:这样这个类的子类不能够置换掉此类的方法
第二、这个类本身就是final的,那么这个类就不可能会有子类,从而也就不可能有被子类修改的问题。593P
二、不变模式的优缺点
不变模式有很明显的有点:
1、因为不能修改一个不变对象的状态,所以可以避免由此引起的不必要的程序错误;换言之,一个不变模式的对象要比可变的
对象更加容易维护。
2、因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,
这样就可以省掉处理同步化的开销。一个不变对象可以自由地被不同的客户端共享。
不变模式唯一的缺点是:
一旦需要修改一个不变对象的状态,就只好创建一个新的同类对象。在需要濒繁修改不变对象的环境里,会有大量的不变对象
作为中间结果被创建出来,再被java语言的垃圾回收器收集走。这是一种资源上的浪费。
三、一个用来说明不变模式的复数类例子
//----- package day1114; @SuppressWarnings("serial") public final class Complex extends Number implements java.io.Serializable, Cloneable, Comparable { // 虚数单位 public static final Complex i = new Complex(0.0, 1.0); // 复数的实部 private double re; // 复数的虚部 private double im; // 构造子,根据传进的复数再构造一个数学值的复数 public Complex(Complex z) { re = z.re; im = z.im; } // 根据传进的实部和虚部构造一个复数对象 public Complex(double re, double im) { this.re = re; this.im = im; } // 构造子,根据一个实部构造复数对象 public Complex(double re) { this.re = re; this.im = 0.0; } // 默认构造子,构造一个为零的复数 public Complex() { re = 0.0; im = 0.0; } // 把本复数与作为参数传进的复数相比较 public boolean equals(Complex z) { return (re == z.re && im == z.im); } // 把本对象与作为参数传进的对象相比较 public boolean equals(Object obj) { if (obj == null) { return false; } else if (obj instanceof Complex) { return equals((Complex) obj); } else { return false; } } public int hashCode() { long re_bits = Double.doubleToLongBits(re); long im_bits = Double.doubleToLongBits(im); return (int) ((re_bits ^ im_bits) ^ ((re_bits ^ im_bits) >> 32)); } // 返回本复数的实部 public double real() { return re; } // 返回本复数的虚部 public double imag() { return im; } // 静态方法,返还作为参数传进的复数的实部 public static double real(Complex z) { return z.re; } // 静态方法,返还作为参数传进的复数的虚部 public static double imag(Complex z) { return z.im; } // 静态方法,返还作为参数传进的复数的相反数 public static Complex negate(Complex z) { return new Complex(-z.re, -z.im); } // 静态方法,返还作为参数传进的复数的共轭数 public static Complex conjugate(Complex z) { return new Complex(z.re, -z.im); } // 静态方法,返还两个数的和 public static Complex add(Complex x, Complex y) { return new Complex(x.re + y.re, x.im + y.im); } public static Complex add(Complex x, double y) { return new Complex(x.re + y, x.im); } public static Complex add(double x, Complex y) { return new Complex(x + y.re, y.im); } // 静态方法,返还两个数的差 public static Complex subtract(Complex x, Complex y) { return new Complex(x.re - y.re, x.im - y.im); } public static Complex subtract(Complex x, double y) { return new Complex(x.re - y, x.im); } public static Complex subtract(double x, Complex y) { return new Complex(x - y.re, -y.im); } // 静态方法,返还两个数的乘积 public static Complex multiply(Complex x, Complex y) { return new Complex(x.re * y.re - x.im * y.im, x.re * y.im + x.im * y.re); } public static Complex multiply(Complex x, double y) { return new Complex(x.re * y, x.im * y); } public static Complex multiply(double x, Complex y) { return new Complex(x * y.re, x * y.im); } public static Complex multiplyImag(Complex x, double y) { return new Complex(-x.im * y, x.re * y); } public static Complex multiplyImag(double x, Complex y) { return new Complex(-x * y.im, x * y.re); } // 静态方法,返还两个数的商 public static Complex divide(Complex x, Complex y) { double a = x.re; double b = x.im; double c = y.re; double d = y.im; @SuppressWarnings("unused") double scale = Math.max(Math.abs(c), Math.abs(d)); double den = c * c + d * d; return new Complex((a * c + b * d) / den, (b * c - a * d) / den); } public static Complex divide(Complex x, double y) { return new Complex(x.re / y, x.im / y); } public static Complex divide(double x, Complex y) { double den, t; Complex z; if (Math.abs(y.re) > Math.abs(y.im)) { t = y.im / y.re; den = y.re + y.im * t; z = new Complex(x / den, -x * t / den); } else { t = y.re / y.im; den = y.im + y.re * t; z = new Complex(x * t / den, -x / den); } return z; } // 静态方法,返还复数的绝对值 public static double abs(Complex z) { return z.re * z.re - z.im * z.im; } // 静态方法,返还复数的相位角 public static double argument(Complex z) { return Math.atan2(z.im, z.re); } // 返还复数的字符串 public String toString() { if (im == 0.0) { return String.valueOf(re); } if (re == 0.0) { return String.valueOf(im) + "i"; } String sign = ((im < 0.0) ? "" : "+"); return (String.valueOf(re) + sign + String.valueOf(im) + "i"); } @Override public double doubleValue() { // TODO Auto-generated method stub return 0; } @Override public float floatValue() { // TODO Auto-generated method stub return 0; } @Override public int intValue() { // TODO Auto-generated method stub return 0; } @Override public long longValue() { // TODO Auto-generated method stub return 0; } public int compareTo(Object o) { // TODO Auto-generated method stub return 0; } } //客户端 public class TestComplex{ public static void main(String args[]){ Complex c1 = new Complex(10,20); Complex c2 = new Complex(0,1); Complex res = Complex.mnltiply(c1,c2); System.out.println("Real part = " + res.real()); System.out.println("Imaginary part = " + res.imag()); } }
发表评论
-
java设计模式笔记链接地址汇总
2009-10-24 14:46 2252各位,这些笔记已经生成了pdf,如果有兴趣的可以在本文末尾下载 ... -
MVC模式【行为模式第十三篇】
2009-10-23 23:36 1479MVC模式:就是模型-视 ... -
状态(State Pattern)模式【行为模式第十二篇】
2009-10-23 23:35 1323状态(State Pattern)模式:又称为状态对象模式,状 ... -
责任链(Chain of Responsibility)模式【行为模式第十一篇】
2009-10-23 23:33 1215责任链(Chain of Responsibility)模式 ... -
模板方法(Template Method)模式【行为模式第十篇】
2009-10-23 23:32 1188模板方法(Template Method)模式 模板方法模式 ... -
命令(Command)模式【行为模式第九篇】
2009-10-23 23:31 1372命令(Command)模式: ... -
解释器(Interpreter)模式【行为模式第八篇】
2009-10-23 23:29 1075解释器(Interpreter)模 ... -
观察者(Observer)模式【行为模式第七篇】
2009-10-23 23:28 1228观察者(Observer)模式 ... -
访问者(Visitor)模式【行为模式第六篇】
2009-10-23 23:26 1065访问者(Visitor)模式: 访问者模式是对象的行为模式。 ... -
迭代子(Iterator)模式【行为模式第五篇】
2009-10-23 23:25 1410迭代子(Iterator)模式: 迭代子模式又叫游标(Cur ... -
调停者(Mediator)模式 【行为模式第四篇】
2009-10-23 23:23 2631调停者(Mediator)模式 调停者模式是对象的行为模式。 ... -
策略(Strategy)模式 【行为模式第三篇】
2009-10-23 23:22 1504策略(Strategy)模式 策略模式属于对象的行为模式。其 ... -
备忘录(Memento Pattern)模式 【行为模式第一篇】
2009-10-23 23:19 1951备忘录(Memento Pattern)模式 备忘录模式又叫 ... -
适配器模式举例【结构模式第八篇】
2009-10-23 23:17 1027XMLProperties与适配器模式举例: //---- ... -
适配器模式【结构模式第六篇】
2009-10-23 23:12 1156适配器模式(Adapter Pattern)(另称-变压器模式 ... -
桥梁(Bridge)模式【结构模式第五篇】
2009-10-23 23:09 1310桥梁(Bridge)模式: 一、桥梁模式的用意 桥梁模式 ... -
门面(Facade)模式【结构模式第四篇】
2009-10-23 23:08 1204门面(Facade)模式: 是对象的结构模式。外部与一个子系 ... -
亨元(Flyweight Pattern)模式【结构模式第三篇】
2009-10-23 23:07 1098亨元(Flyweight Pattern) ... -
合成(Composite)模型模式【结构模式第二篇】
2009-10-23 23:04 1348合成(Composite)模型模式: 属于对象的结构模式,有 ... -
代理(Proxy)模式 【结构模式第一篇】
2009-10-23 23:02 1365代理(Proxy)模式 是对 ...
相关推荐
前端开源库-immutable-core不变的核心,不变的模块化框架
2.Overview of Docker the latest stuff (DCUS announcements) & CaaS; 3.Overview of Immutable infrastructure and Microservices; 4.Docker and Immutable infrastructure/Microservices working together.
简单介绍Immutable.js的一个ppt,主要用于技术分享,内容为imuutabe常用的数据类型和常用的基础api,还有immutable的原理、优缺点的分析。
Mastering Immutable.js 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
immutability-util:一个开源 immutable data 的轮子
前端开源库-immutable-ai不可变人工智能,不可变核心的可选接口
Immutable详解及React中实践.pdf
com.javapatterns.immutable 不变模式 com.javapatterns.interfaces Java接口 com.javapatterns.interpreter 解释器模式 com.javapatterns.isp 接口隔离原则 com.javapatterns.iterator 迭代子模式 ...
Immutable Collections Library for Kotlin Immutable collection interfaces and implementation prototypes for Kotlin. For further details see the proposal. Prototype implementation is based on ...
Mastering Immutable PDF Mastering Immutable epub Mastering Immutable azw3 示例源码
go-immutable-radix, 在Golang中,一个不可变的基数树实现 go-immutable-radix 提供实现不可变 radix的iradix 包。 包只提供单个 Tree 实现,针对稀疏节点优化。作为一个基数树,它提供以下内容:O(k) 操作。在许多...
不可变视图-其他集合对象的不可变视图概述... immutable-views包中的视图类实现了相应的Python集合类型的完整行为,除了会修改集合对象的任何操作之外。 视图类将所有操作委托给它们作为视图的原始集合对象。 因此
提供一个抽象的ImmutableCollection类,该类扩展(并限制了)SplFixedArray类,并提供(派生的)不可变集合类具有行为逻辑的多个特征。 为什么用这个 常规的php“数组”根本不是数组,而是经过排序的哈希图。 它们...
工厂模式Factory 原始...不变Immutable 策略Strategy 模版Template 观察者Observer 命令Command 备忘录Memento 状态State 访问者Visitor 解释器Interpreter 调停者Mediator Iterator 责任链Chain of Responsibility
不可变的 不变的MongoDB。 该库是NodeJS mongodb API的直接替换方法的集合,这些方法允许mongodb用作不可变数据库。 实现是幼稚的,并且不强制执行锁定,而Mongo仅在文档级别上支持该锁定。 它尚未在生产中经过测试...
Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了...
不可变的角度 支持在 Angular 1.x 中查看和枚举集合 ... import Immutable from 'immutable' ; class SomethingController { static get $inject ( ) { return [ '$scope' ] ; } constructor ( $
immutable - Javascript不可变的持久化数据集合
dot-prop-immutable, 点prop的不可变版本,带有一些扩展名 dot-prop-immutable 点prop的不可变版本,带有一些扩展名。npm install dot-prop-immutable这个模块的动机是在不改变普通JavaScript对象的现有状态的情况
Immutable List,顾名思义,就是,啥,不明白 Immutable 是什么意思?一成不变的意思,所以 Immutable List 就是一个不可变的 List 类,这意味着该 List 声明后,它的内容就是固定的,不可增删改的。 如果尝试对 ...