黑马程序员技术交流社区

标题: java中一些简单的设计模式 [打印本页]

作者: kingowe    时间: 2015-5-21 11:56
标题: java中一些简单的设计模式

        适配器设计模式





        。该设计模式 在 GUI中常用,J2EE中并不常见


    如果一个类要 implements 一个 interface,则必须要重写该 interface 中的全部 abstract 方法,此时 如果一个 interface 中的抽象方法过多,
        并且在该类中用不到这么多的 abstract 方法,则会很麻烦,所以需要一个中间的 abstract class 来过渡,即 一个 interface 先被一个 abstract
            class 实现(该 abstract class 通常被称为 适配器 Adapter) ,并在该 abstract class 中实现若干方法(方法体为空), 则 以后的需要实现该 interface
                的 class 直接 extends 该 abstract class( Adapter )即可。





interface Window{                // 定义Window接口,表示窗口操作
        public void open() ;        // 打开
        public void close() ;        // 关闭
        public void activated() ;        // 窗口活动
        public void iconified() ;        // 窗口最小化
        public void deiconified();// 窗口恢复大小
}
abstract class WindowAdapter implements Window{               
// 在该class 中 实现了全部的 interface Window 中的方法,虽然是 abstract class,但是
//该类中的方法都为已经重写的 非 abstract 方法
        public void open(){} ;        // 打开
        public void close(){} ;        // 关闭
        public void activated(){} ;        // 窗口活动
        public void iconified(){} ;        // 窗口最小化
        public void deiconified(){};// 窗口恢复大小
};
class WindowImpl extends WindowAdapter{
        public void open(){
                System.out.println("窗口打开。") ;
        }
        public void close(){
                System.out.println("窗口关闭。") ;
        }
};
public class AdapterDemo{
        public static void main(String args[]){
                Window win = new WindowImpl() ;
                win.open() ;
                win.close() ;
        }
};



        工厂设计模式


        。main 方法一般就表示一个 client,在 main()  中的代码越少越好



原设计思路:

interface Fruit{        // 定义一个水果接口
        public void eat() ;        // 吃水果
}
class Apple implements Fruit{
        public void eat(){
                System.out.println("** 吃苹果。") ;
        }
};
class Orange implements Fruit{
        public void eat(){
                System.out.println("** 吃橘子。") ;
        }
};
public class InterfaceCaseDemo03{
        public static void main(String args[]){
                Fruit f = new Apple() ;       
                // 实例化接口  此时在 main() 中指定了要操作的 subclass,如果要更换 subclass,则肯定要修改 client,
                        // 所以此种设计 不合理
                f.eat() ;                       

        }
};



修改后:

interface Fruit{        // 定义一个水果接口
        public void eat() ;        // 吃水果
}
class Apple implements Fruit{
        public void eat(){
                System.out.println("** 吃苹果。") ;
        }
};
class Orange implements Fruit{
        public void eat(){
                System.out.println("** 吃橘子。") ;
        }
};
class Factory{        // 定义工厂类
        public static Fruit getInstance(String className){
                Fruit f = null ;
                if("apple".equals(className)){
                // 判断是否要的是苹果的子类 如果此处为 className.equals("apple");  则传入 null 时会有空指针异常
                        f = new Apple() ;
                }
                if("orange".equals(className)){        // 判断是否要的是橘子的子类 此处同 apple一样
                        f = new Orange() ;
                }
                return f ;
        }
};
public class InterfaceCaseDemo05{
        public static void main(String args[]){
                Fruit f = Factory.getInstance(args[0]) ;   // 实例化接口,
                if(f!=null){        // 判断是否取得实例
                        f.eat() ;
                }
        }
};


》》--》》  面  向  接  口  编  程 (command 命令模式)

public interface Command  // 通过一个 command interface 让 ProcessArray 与具体的处理方式分离
{
    void process(int[] target) ;  // 定义一个 处理数组 的方法,具体的处理方式 由其实现类来定义
}

class PrintCommand implements Command {
        public void process(int[] target) {
                System.out.print("数组中的元素:");
                for (int temp : target) {
                        System.out.print(temp+"   ");
                }
        }
}

class AddCommand implements Command {
        public void process(int[] target) {
                int sum = 0;
                for (int temp : target) {
                        sum += temp;
                }
                System.out.print("数组中元素的和:" + sum);
        }
}

class ProcessArray {
        public void arrayWork(int[] target, Command cmd) {
                cmd.process(target);
        }
}
// 测试类
public class Demo {
        public static void main(String[] arga) {
                ProcessArray pa = new ProcessArray();
                int[] arr = { 1, 3, 5, 7 };
                pa.arrayWork(arr, new PrintCommand());
                pa.arrayWork(arr, new AddCommand());
        }
}





作者: qinhaihang    时间: 2015-5-21 16:08
虽然很乱,看不清楚,但是还是赞一个
作者: kingowe    时间: 2015-5-21 21:24
qinhaihang 发表于 2015-5-21 16:08
虽然很乱,看不清楚,但是还是赞一个

谢谢啊,你也在努力攒分吧
作者: zhangjnia    时间: 2015-5-21 22:07
不错不错,学习了
作者: qinhaihang    时间: 2015-5-24 12:31
kingowe 发表于 2015-5-21 21:24
谢谢啊,你也在努力攒分吧

是啊,还在苦逼的看视频学习中,你报哪一期啊?
作者: kingowe    时间: 2015-5-24 12:39
qinhaihang 发表于 2015-5-24 12:31
是啊,还在苦逼的看视频学习中,你报哪一期啊?

我估计到8月份左右了,现在还在上学呢, 要攒分给你推荐个好方法:在入学技术交流里边发帖,主题分类就选入学交流,每天发几次,一次就能拿2个黑马币,你再两天就够了
作者: hieiyukina    时间: 2015-5-24 12:48
吼吼学习一下 谢谢分享
作者: qinhaihang    时间: 2015-5-24 12:49
kingowe 发表于 2015-5-24 12:39
我估计到8月份左右了,现在还在上学呢, 要攒分给你推荐个好方法:在入学技术交流里边发帖,主题分类就选 ...

我差不多也这样弄过,原来你还在上学,哈哈,我都毕业一年了
作者: zhangjnia    时间: 2015-5-24 15:09
不错不错,学习了
作者: 追忆似水年华    时间: 2015-5-24 16:09
不错学习了。


作者: 南方小道士    时间: 2015-5-24 22:48
学习了一下
作者: 紫夜流星    时间: 2015-5-24 23:25
收藏了  
作者: kingowe    时间: 2015-5-25 13:48
紫夜流星 发表于 2015-5-24 23:25
收藏了

恩、收藏了
作者: kingowe    时间: 2015-5-30 09:03
不错 学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2