`
java苹果+番茄
  • 浏览: 65729 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

不变(Immutable)模式【行为模式第二篇】

阅读更多
不变(Immutable)模式
一个对象的状态在对象被创建之后就不再变化,这就是不变模式。

一、不变模式有两种模式
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());
			}
		}
分享到:
评论

相关推荐

    前端开源库-immutable-core

    前端开源库-immutable-core不变的核心,不变的模块化框架

    Docker and Immutable Infrastructure

    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.pptx

    简单介绍Immutable.js的一个ppt,主要用于技术分享,内容为imuutabe常用的数据类型和常用的基础api,还有immutable的原理、优缺点的分析。

    Mastering Immutable.js epub

    Mastering Immutable.js 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    immutabilityutil一个开源immutabledata的轮子

    immutability-util:一个开源 immutable data 的轮子

    前端开源库-immutable-ai

    前端开源库-immutable-ai不可变人工智能,不可变核心的可选接口

    Immutable详解及React中实践.pdf

    Immutable详解及React中实践.pdf

    源码:阎宏设计模式光盘

    com.javapatterns.immutable 不变模式 com.javapatterns.interfaces Java接口 com.javapatterns.interpreter 解释器模式 com.javapatterns.isp 接口隔离原则 com.javapatterns.iterator 迭代子模式 ...

    Android代码-kotlinx.collections.immutable

    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

    Mastering Immutable PDF Mastering Immutable epub Mastering Immutable azw3 示例源码

    go-immutable-radix, 在Golang中,一个不可变的基数树实现.zip

    go-immutable-radix, 在Golang中,一个不可变的基数树实现 go-immutable-radix 提供实现不可变 radix的iradix 包。 包只提供单个 Tree 实现,针对稀疏节点优化。作为一个基数树,它提供以下内容:O(k) 操作。在许多...

    immutable-views:其他集合对象的不变视图

    不可变视图-其他集合对象的不可变视图概述... immutable-views包中的视图类实现了相应的Python集合类型的完整行为,除了会修改集合对象的任何操作之外。 视图类将所有操作委托给它们作为视图的原始集合对象。 因此

    ImmutableCollection:Collection接口的不变实现

    提供一个抽象的ImmutableCollection类,该类扩展(并限制了)SplFixedArray类,并提供(派生的)不可变集合类具有行为逻辑的多个特征。 为什么用这个 常规的php“数组”根本不是数组,而是经过排序的哈希图。 它们...

    java26个设计模式

    工厂模式Factory 原始...不变Immutable 策略Strategy 模版Template 观察者Observer 命令Command 备忘录Memento 状态State 访问者Visitor 解释器Interpreter 调停者Mediator Iterator 责任链Chain of Responsibility

    mongo-immutable:不变的MongoDB

    不可变的 不变的MongoDB。 该库是NodeJS mongodb API的直接替换方法的集合,这些方法允许mongodb用作不可变数据库。 实现是幼稚的,并且不强制执行锁定,而Mongo仅在文档级别上支持该锁定。 它尚未在生产中经过测试...

    immutable在redux中的使用

    Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了...

    immutable-angular:在 Angular 中迭代和观察 immutable-js 集合

    不可变的角度 支持在 Angular 1.x 中查看和枚举集合 ... import Immutable from 'immutable' ; class SomethingController { static get $inject ( ) { return [ '$scope' ] ; } constructor ( $

    Node.js-immutable-Javascript不可变的持久化数据集合

    immutable - Javascript不可变的持久化数据集合

    dot-prop-immutable, 点prop的不可变版本,带有一些扩展名.zip

    dot-prop-immutable, 点prop的不可变版本,带有一些扩展名 dot-prop-immutable 点prop的不可变版本,带有一些扩展名。npm install dot-prop-immutable这个模块的动机是在不改变普通JavaScript对象的现有状态的情况

    高效安全的Immutable List好处.docx

    Immutable List,顾名思义,就是,啥,不明白 Immutable 是什么意思?一成不变的意思,所以 Immutable List 就是一个不可变的 List 类,这意味着该 List 声明后,它的内容就是固定的,不可增删改的。 如果尝试对 ...

Global site tag (gtag.js) - Google Analytics