`

[原]不变模式

阅读更多
[关键字]:java,design pattern,设计模式,《Java与模式》学习,Immutable Pattern,不变模式
[环境]:StarUML5.0 + JDK6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys/
[正文]:

package pattern.immutable;
import java.text.NumberFormat;

/**
 * 不变模式:Immutable Pattern
 *
 * 复数的四则运算
 * @version 2009-6-15
 * @author Winty(wintys@gmail.com)
 */
public class ImmutableTest{
    public static void main(String[] args){
        Complex a , b , c , d , e , f , g;
        a = new Complex(0 , 2);
        b = new Complex(3 , -5);

        c = a.add(b);
        d = a.sub(b);
        e = a.mul(b);
        f = a.div(b);
        g = a.add(Complex.i);

        System.out.println("a="+a);
        System.out.println("b="+b);
        System.out.println("i="+Complex.i);
        System.out.println("a+b="+c);
        System.out.println("a-b="+d);
        System.out.println("a*b="+e);
        System.out.println("a/b="+f);
        System.out.println("a+i="+g);        
    }
}

final class Complex extends Number{
    private double real;//实部
    private double imaginary;//虚部
    public static final Complex i;//虚数单位

    static{
        i = new Complex(0 , 1);
    }

    public Complex(){
        real = 0.0;
        imaginary = 0.0;
    }

    public Complex(double real , double imaginary){
        this.real = real;
        this.imaginary = imaginary;
    }

    public double getReal(){
        return real;
    }

    public double getImaginary(){
        return imaginary;
    }

    /**
     * 复数相加
     */
    public Complex add(Complex c){
        return new Complex(real + c.getReal() ,
                                    imaginary + c.getImaginary());
    }

    /**
     * 复数相减
     */
    public Complex sub(Complex c){
        return new Complex(real - c.getReal() ,
                                    imaginary - c.getImaginary());
    }

    /**
     * 复数相乘:(a+bi)(c+di)=(ac-bd)+(ad+bc)i
     */
    public Complex mul(Complex c){
        double r = c.getReal();
        double i = c.getImaginary();
        r = real*r - imaginary*i;
        i = real*i + imaginary*r;

        return new Complex(r , i);
    }

    /**
     * 复数除法:
     * (a+bi)(c+di) = (a*c + b*d)/(c*c+d*d) + (b*c - a*d)/(c*c+d*d)
     */
    public Complex div(Complex complex){
        double a,b,c,d;
        double denominator;
        a = real;
        b = imaginary;
        c = complex.getReal();
        d = complex.getImaginary();
        denominator = c*c + d*d;

        double r = (a*c + b*d)/denominator;
        double i = (b*c - a*d)/denominator;

        return new Complex(r , i);
    }

    public double abs(){
        return Math.sqrt(real*real + imaginary*imaginary);
    }

    @Override
    public double doubleValue(){
        return real;
    }

    @Override
    public float floatValue(){
        return (float)real;
    }

    @Override
    public int intValue(){
        return (int)real;
    }

    @Override
    public long longValue(){
        return (long)real;
    }

    public String toString(){
        NumberFormat f = NumberFormat.getNumberInstance();
        f.setMaximumFractionDigits(2);
        String strReal = f.format(real);
        String strImaginary = f.format(imaginary);
        String str = "";

        String sign = "";
        
        if(real != 0){//实部不为0时才显示实部
            str = strReal;

            if(imaginary > 0)
                sign = "+";
        }
        str += sign + strImaginary + "*i";

        return str;
    }
}

运行结果:
a=2*i
b=3-5*i
i=1*i
a+b=3-3*i
a-b=-3+7*i
a*b=10+20*i
a/b=-0.29+0.18*i
a+i=3*i
原创作品,转载请注明出处。
作者:Winty (wintys@gmail.com)
博客:http://www.blogjava.net/wintys
分享到:
评论

相关推荐

    模式分类(原书第2版)

    ### 模式分类(原书第2版):核心知识点概览 #### 一、引言 本书《模式分类(原书第2版)》是一部关于模式识别的经典教材,主要探讨了统计模式识别和结构模式识别的基础理论及应用,并且在新版中增加了新的理论和方法...

    bubianju.rar_ bubianju_bubianju_bubianju matlab_matlab 不变矩_不变矩

    学习和理解这些不变矩的计算方法和应用,对于进行图像分析和模式识别项目是非常有益的。例如,可以用于指纹识别、车牌识别、手写数字识别等场景。Matlab作为强大的科学计算工具,为研究和开发提供了便利的环境,使得...

    C#23种设计模式_示例源代码及PDF

    原始模型模式: 原始模型模式 通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原 型对象的方法创建出更多同类型的对象。 原始模型模式允许动态的增加或减少产品类, 产品 类不需要非得有任何事先...

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    这种模式通常用于保持对象的原始类结构不变,同时增强其功能。HeadFirst 设计模式系列书籍以其生动有趣的插图和易懂的解释闻名,帮助读者深入理解各种设计模式。 在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”...

    .net实现设计模式之代理模式

    代理模式的核心思想是为一个对象提供一个替代品或代表,这个替代品能够控制对原对象的访问,使得客户端代码可以通过代理对象与真实对象进行交互,而无需直接暴露真实对象的所有细节。这种设计模式在很多场景下都非常...

    《设计模式(第2版)》源代码_设计模式教学代码_

    11. **装饰模式**:装饰类包装原类对象,添加新的行为或属性,同时保持原有接口不变,增强了类的功能。 12. **享元模式**:运用共享技术有效地支持大量细粒度的对象。享元模式可以大幅度减少内存中对象的数量,降低...

    c++23种设计模式

    在C++中,装饰模式可以通过继承和组合来实现,保持原有类的接口不变。 9. 外观模式:提供一个统一的接口,用来访问子系统中的一组接口。C++中的外观模式可以帮助简化客户端与复杂系统之间的交互。 10. 适配器模式...

    设计模式JAVA(学习java模式的一本好书)

    尽管原书中使用的是C++示例,但随着Java的普及和发展,越来越多的开发者倾向于使用Java来理解和实践设计模式。 #### Java设计模式特点 Java语言本身具备简洁性与面向对象特性,这使得Java成为学习和实践设计模式的...

    程序设计模式实例分析

    ### 程序设计模式实例分析 #### 备忘录模式 (Memento Pattern) ...这两种模式都体现了设计模式的核心思想——通过增加抽象层,将变化的部分与不变的部分分离,从而达到代码的可复用性和可维护性。

    游戏设计3-装饰者模式-装备

    装饰者模式的核心思想是将一个对象包装在一个装饰器对象中,装饰器对象拥有与原对象相同的接口,这样就可以透明地对原对象进行增强,同时保持原有功能不变。 首先,我们需要定义一个基础装备类(BaseEquipment),...

    23种设计模式的java源代码实现.rar

    在Java中,享元模式常用于节省内存,通过共享大量细粒度对象的不变部分来实现。 5. **访问者(Visitor)模式**:分离对象结构的操作与其执行操作。Java中,访问者模式可以用于在不改变对象结构的前提下,添加新的...

    大话西游之设计模式_从猴王学艺看Decorator 配套代码

    这个模式的核心思想是封装额外的功能,使得原有对象的功能得到扩展,同时保持原有接口的不变,从而实现对对象功能的透明化增强。 "大话西游之设计模式_从猴王学艺看Decorator"这篇文章将设计模式的概念与经典电影...

    7. 装饰器模式1

    装饰器模式的本质是通过类的继承和实例化,构建出一个对象的“套娃”结构,每个装饰类都包含一个原对象的引用,这样就可以在保持原对象接口不变的前提下,叠加新的行为。这种模式的优势在于灵活性,因为它允许在运行...

    活学活用 生活中的设计模式

    代理模式是一种结构型设计模式,它给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 **关键知识点**: - **基本概念**:提供一个代理来控制对一个对象的访问。 - **应用场景**:为了控制对某个对象的...

    C++的设计模式学习资料

    - **适用场景**:远程代理时,或者为了控制对一个对象的访问,给某一个对象提供一个代理,并由代理对象控制对原对象的引用时。 #### 四、行为型模式 行为型模式关注的是对象之间的通信,即类或对象如何交互以及...

    java代理模式

    代理模式的核心思想是为一个对象提供一个代理,并由代理对象控制对原对象的引用。在Java中,代理模式有静态代理和动态代理两种实现方式。 首先,我们来详细了解一下静态代理。在静态代理中,我们需要创建一个代理类...

    Photoshop图层混合模式说明.doc

    3. **变暗模式**:选取基色和混合色中较暗的颜色作为结果色,比混合色亮的像素会被替换,而较暗的像素保持不变。 4. **正片叠底模式**:在每个颜色通道中,基色和混合色复合,产生较暗的结果色。黑色混合产生黑色,...

    设计模式系列之装饰模式

    装饰模式是一种结构型设计模式,它允许在运行时动态地为对象添加新的行为或职责,同时保持对象的接口不变。这种模式在不修改原有代码的基础上,通过组合而非继承来扩展对象的功能,避免了类爆炸的问题。 装饰模式的...

Global site tag (gtag.js) - Google Analytics