zoukankan      html  css  js  c++  java
  • 23种设计模式

    *********简单工厂模式*******

    我们设计或者写出来的代码,要容易维护、容易扩展、并且容易复用

    值需要改正要改的地方,这叫做可维护

    以后出现类似的情况还可以用这一段代码,就叫做可复用

    如若要添加其他东西,添加就好了,这叫做可扩展

    要是能够随便移动项目中代码的位置,这叫做灵活性好

    比如说写一个计算器的代码,就最好将业务层和界面进行分离,

    **************策略模式*******************

    案例:商场收银软件

    对于算法经常变动的项目一般情况下建议使用。

    *************单一职责原则***********************

    就一个类而言,应该仅有一个引起他变化的原因。

    *************开放封闭原则*********************

    通俗的话讲,就是做两手准备

    软件实体应该可以扩展,但是不能够进行修改。

    ***********************装饰模式 *********************

    *******************代理模式***********************

    迭代器设计模式:

    创建容器

    package com.bjsxt.dp.iterator;
    import com.bjsxt.dp.iterator.Collection;
    
    public class ArrayList implements Collection {
        // 创建一个对象的的数组,这样就能够放入任意类型的对象了
        Object[] objects = new Object[10];
        int index = 0;
    
        public void add(Object o) {
            //这样只要在自己内存允许的情况下,就可以 无限制的添加了
            if(index==objects.length){
                Object[] newObjects=new Object[objects.length*2];
                //将原来的数组存放到新数组中
                System.arraycopy(objects, 0, newObjects, 0, objects.length);
               //将原来数组的引用指向新的数组
                objects=newObjects;
                
            }
            objects[index] = o;// 表示新加进来的对象
            index++;
    
        }
        //看看最后装了 多少个
        public int size(){
            return index;
        }
        
        public Iterator iterator(){
            
            
            
            return new ArrayListIterator();//现在不要官具体是怎样实现的
            
        }
    //使用内部类的方式
        private class ArrayListIterator implements Iterator{
            private int currentIndex=0;
        @Override
        public Object next() {
            
            Object o= objects[currentIndex];
            currentIndex++;
            return o;
        
        }
    
        @Override
        public boolean hasNext() {
            
            if (currentIndex>=index) {
                return false;
                
            }else{
                return true;
            }
        }
            
        }
    
    }
    package com.bjsxt.dp.iterator;
    
    public class Cat {
        private int id;
    
        public Cat() {
            super();
        }
    
        public Cat(int id) {
            super();
            this.id = id;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        @Override
        public String toString() {
            return "Cat [id=" + id + "]";
        }
    
    }
    package com.bjsxt.dp.iterator;
    
    //集合类中的顶级父类
    public interface Collection {
        public void add(Object o);
        public int size();
        public  Iterator iterator();//定义这样的遍历接口
    }
    package com.bjsxt.dp.iterator;
    //所有的容器提供一种统一的遍历方式
    public interface Iterator {
        public  Object next();
        boolean hasNext();
    
    }
    package com.bjsxt.dp.iterator;
    import com.bjsxt.dp.iterator.Collection;
    //使用链表方式的容器
    public class LinkedList implements Collection{
        Node head = null;
        Node tail = null;
        int size = 0;
    
        public void add(Object o) {
            Node n = new Node(o, null);
            if (head == null) {
                head = n;
                tail=n;
            }
            tail.setNext(n);
            tail=n;
            size++;
        }
    
        public int size() {
            return size;
        }
    
        @Override
        public Iterator iterator() {
            // TODO Auto-generated method stub
            return null;
        }
    }
    package com.bjsxt.dp.iterator;
    
    //节点类
    public class Node {
        private Object data;// 数据本身
        private Node next;// 那只拉住下一个节点的小手
    
        public Node() {
            super();
        }
    
        public Node(Object data, Node next) {
            super();
            this.data = data;
            this.next = next;
        }
    
        public Object getData() {
            return data;
        }
    
        public void setData(Object data) {
            this.data = data;
        }
    
        public Node getNext() {
            return next;
        }
    
        public void setNext(Node next) {
            this.next = next;
        }
    
    }
    package com.bjsxt.dp.iterator;
    
    //注意这里我们引用自己定义的Arraylist类,而不是使用jdk自带的arraylist类
    //这个容器比数组好用
    import org.junit.Test;
    
    import com.bjsxt.dp.iterator.ArrayList;;
    
    public class TestMethod {
        @Test
        public void test01() {
            ArrayList al = new ArrayList();
            for (int i = 0; i < 15; i++) {
                al.add(new Cat(i));
            }
            System.out.println(al.size());
        }
        @Test
        public void test02() {
            LinkedList al = new LinkedList();
            for (int i = 0; i < 15; i++) {
                al.add(new Cat(i));
            }
            System.out.println(al.size());
        }
        @Test
        public void test03() {
            Collection al = new ArrayList();//这就是考虑到了容器的可替换性,面向接口编程
            for (int i = 0; i < 15; i++) {
                al.add(new Cat(i));
            }
            System.out.println(al.size());
            //容器的遍历
            Iterator it=al.iterator();
            while(it.hasNext()){
                Object o=it.next();
                System.out.println(o+"++");
            }
        }
    
    }
    package com.bjsxt.dp.iterator.generic;
    
    import com.bjsxt.dp.iterator.ArrayList;
    
    //支持泛型的
    public class GenericArrayList<E> {//其中E表示的是具体的类型
        // 创建一个对象的的数组,这样就能够放入任意类型的对象了
            Object[] objects = new Object[10];
            int index = 0;
    
            public void add(E o) {
                //这样只要在自己内存允许的情况下,就可以 无限制的添加了
                if(index==objects.length){
                    Object[] newObjects=new Object[objects.length*2];
                    //将原来的数组存放到新数组中
                    System.arraycopy(objects, 0, newObjects, 0, objects.length);
                   //将原来数组的引用指向新的数组
                    objects=newObjects;
                    
                }
                objects[index] = o;// 表示新加进来的对象
                index++;
    
            }
            //看看最后装了 多少个
            public int size(){
                return index;
            }
            
            //测试方法
            public static void main(String[] args) {
                GenericArrayList<String> list=new GenericArrayList<>();
                list.add("aaa");
                list.add("bbb");
                /*for (int i = 0; i <list.size(); i++) {
                    System.out.println("现在输出的是:"+list.get(i));
                      system.out.println(list.get(i));
                    
                }*///这种方式是遍历不出来的
            /*    for(String item:list){
                    System.out.println(item);
                }*///这种方式是遍历不出来的
            }
    
    }

    变量私有的叫做字段,公有的叫做属性

    使用protected修饰的成员对子类公开,对其他的类是不公开的

    继承是有缺点的,父类变动,子类也得跟着做出相应的变动

    同时,继承会破环包装,父类的实现细节暴漏给子类,这其实大大增加 两者之间的耦合性。

    一个类是另外一个  类的特殊类

    抽象方法没有方法体,抽象类中是可以有普通方法的

    *******************桥接模式***********************

    注意父类引用指向子类的具体实现,是在继承的情况下完成的

    在子类向父类进行扩展的时候,有两个纬度上面的扩展,一个是具体类型的,另外一个是抽象类型上面的。

    两个纬度之间会有交叉

    在设计的时候一定要谨慎的使用继承

    使用桥接模式:在两个维度进行排列组合

    聚合就是一个类中有对其他类的引用

    package com.bjsxt.dp.brige;
    //桥接模式    男孩类型
    public class Boy {
        private String name;
    //MM mm;区别:这样写其实是让两者的关系变得更加的紧密了,但是处于java设计中,高内聚,低耦合的思想,建议两者之间还是保持一定的距离比较好
        
        public Boy() {
            super();
        }
    
        public Boy(String name) {
            super();
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "MM [name=" + name + "]";
        }
        //添加追的方法
        public   void    pursue(MM mm){
        Gift warmGift = new WarmGift(new Flower());//用到的多态
            give(warmGift, mm);
        }
        //送礼物的方法
        public  void   give(Gift gift,MM mm){
            
        }
        
    
    }
    package com.bjsxt.dp.brige;
    //鲜花类
    public class Flower extends GiftImpl {
    
    }
    package com.bjsxt.dp.brige;
    //礼物类 
    public class Gift {
     protected GiftImpl impl;//这是一种聚合的手段
    //下面的set和get方法写不写都是可以的
    
    public GiftImpl getImpl() {
        return impl;
    }
    
    public void setImpl(GiftImpl impl) {
        this.impl = impl;
    }
    
    }
    package com.bjsxt.dp.brige;
    
    //礼物的实现类
    public class GiftImpl {
    
    }
    
    package com.bjsxt.dp.brige;
    //桥接模式    美眉类
    public class MM {
        private String name;
    
        public MM() {
            super();
        }
    
        public MM(String name) {
            super();
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "MM [name=" + name + "]";
        }
        
        
    
    }
    
    package com.bjsxt.dp.brige;
    //钻戒类
    public class Ring extends GiftImpl {
    
    }
    
    package com.bjsxt.dp.brige;
    
    public class Test {
    public static void main(String[] args) {
        Boy boy=new Boy("小名");
            boy.give(new Gift(), new MM("小美"));
        
    }
    }
    
    
    package com.bjsxt.dp.brige;
    //追温柔类型的女孩用温柔类型的礼物
    public class WarmGift extends Gift{
    public   WarmGift(Flower flower){
            this.impl = impl;
        
    }
    }
    
    package com.bjsxt.dp.brige;
    //追狂野类型的女孩,用狂野类型的礼物
    public class WildGift extends Gift{
    
    }

    **************适配器模式****************

    比方说:类似与以前学过的变压器。

    经典的面试题:java。io包中用到了什么设计模式:适配器模式    将inputstream转换成reader

     *************命令模式*********************

    package com.bjsxt.dp.command;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Boy {
        private String name;
        private List<Command> commands=new ArrayList<Command>();
    
        public List<Command> getCommands() {
            return commands;
        }
    
        public void setCommands(List<Command> commands) {
            this.commands = commands;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        // 添加追的方法
        public void pursue(MM mm) {
            //Gift warmGift = new WarmGift(new Flower());// 用到的多态
            //give(warmGift, mm);
        }
       //美眉发布命令,男孩去做
        public void doSomeThing() {
            // TODO Auto-generated method stub
            Command command=new HugCommand();
            
        }
        public     void addCommand(Command c1){
            this.commands.add(c1);
        }
    
        public void excuteCommands() {
            for(Command item:commands){
                item.excute();
            }
            
        }
        public void undoCommand(){
            /*这里没有代码的实现,具体的思路是,要先将之前的所有操作保存到list集合中,
            然后通过遍历,先删除最近一次的操作,然后在删除第一次的操作就可以了*/
            
        }
    
    }
    package com.bjsxt.dp.command;
    //在原来的23种设计模式中,command模式最主要是来实现undo的功能
    public abstract class Command {
        public abstract void  excute();
        public abstract void  unDo();
    
    }
    package com.bjsxt.dp.command;
    
    public class HugCommand extends Command{
    
        public void excute() {
            // TODO Auto-generated method stub
            System.out.println("拥抱");
        }
    
        public void unDo() {
            System.out.println("不拥抱");
            // TODO Auto-generated method stub
            
        }
    
    }
    package com.bjsxt.dp.command;
    
    public class MM {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        //命令方法
        public void order(Boy boy){
            Command c1=new ShoppingCommand();
            
            c1=new HugCommand();
            Command c2=new ShoppingCommand();
            c2=new ShoppingCommand();
            //赶紧让他去执行
            boy.excuteCommands();
        }
    }
    package com.bjsxt.dp.command;
    
    public class ShoppingCommand extends Command {
    //子类继承父类的时候,一定要实现父类中的所有的抽象方法
        public void excute() {
            System.out.println("去动物园");
            
        }
    
        public void unDo() {
            System.out.println("不去动物园");
            // TODO Auto-generated method stub
            
        }
    
    }

    ****************状态模式**************

     java重构:指程序员对已有程序在尽量不改变接口的前提下,进行重新编写代码的工作,一般有以下几方面:
    1、去除已知bug。
    2、提高程序运行效率。
    3、增加新的功能

    package com.bjsxt.dp.state;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Boy {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    
    }
    
    
    package com.bjsxt.dp.state;
    //其实这就是简单状态下的多态的运用
    public class MM {
        private String name;
        private MMState mmState = new MMHappyState();// 这是自己决定的
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        // 现在的女孩是一种善变的动物 在不同的条件下,这三种状态所表现出来的样子是不一样的
        public void smile() {
            mmState.smile();
        }
    
        public void cry() {
            mmState.cry();
        }
    
        public void saySomething() {
            mmState.saySomething();
        }
    
    }
    
    
    package com.bjsxt.dp.state;
    
    //这是 在快乐的状态下面
    public class MMHappyState extends MMState {
    
        @Override
        public void smile() {
            System.out.println("快乐的笑");
    
        }
    
        @Override
        public void cry() {
            System.out.println("快乐的哭");
        }
    
        @Override
        public void saySomething() {
            System.out.println("快乐的做事情");
        }
    
    }
    
    
    package com.bjsxt.dp.state;
    //这是在悲伤的情况下
    public class MMSadState extends MMState {
    
        @Override
        public void smile() {
            System.out.println("悲伤的笑");
        
            
        }
    
        @Override
        public void cry() {
            System.out.println("悲伤的哭");        
        }
    
        @Override
        public void saySomething() {
            System.out.println("悲伤的做事情");
            
        }
    
    }
    
    package com.bjsxt.dp.state;
    
    //美美的状态
    public abstract class MMState {
        public abstract void smile();
    
        public abstract void cry();
    
        public abstract void saySomething();
    }

    **************中介者模式 *******************

    这种设计模式指的是当有-一堆对象,彼此之间的关系又错综复杂,而你又理不清楚,这时候,我们可以设计一个中间者,让所有的对象都不要和其他对象产生联系,先和这个中间者产生关系。

    *************Facade(外观模式)*************

    这个facade是是处理各个对象之间错综复杂关系的,用户在处理这些对象之间的关系的时候,只需要访问这个facade就可以了

     ******************动态代理**************

    聚合要比继承好

    让传接口,可以传她的实现类

    ****************工厂模式 *******************

    简单工厂模式:

    package com.bjsxt.dp.factory;
    
    //飞天扫帚
    public class Broom implements Moveable {
    
        @Override
        public void run() {
            System.out.println("骑着扫帚飞");
        }
    
    }
    
    
    package com.bjsxt.dp.factory;
    //生产汽车的工厂
    public class BroomFactory extends VehicleFactory {
    public Broom createCar(){
        return new Broom();
    }
    
    @Override
    public Moveable create() {
        // TODO Auto-generated method stub
        return new Broom();
    }
    }
    
    package com.bjsxt.dp.factory;
    
    import java.util.ArrayList;
    import java.util.List;
    
    //工厂模式
    //车类
    public class Car implements Moveable{
    //    private Car(){} 将构造方法编程私有的,在测试类中就不能够new car() 了
        public Car(){}
        private static Car car=new Car();//单例模式
        //有人把这种模式叫做多例模式
        private static List<Car> cars=new ArrayList<Car>();//当你需要其中的某一辆车的时候,直接拿一辆出来就行了,
        //这种方法Car类就能够控制自己的产生了
        public  static Car getInstance(){//静态工厂方法
            return car;
        }
    public void run(){
        System.out.println("汽车正在冒着烟奔跑中》》》");
    }
    }
    
    package com.bjsxt.dp.factory;
    //生产汽车的工厂
    public class CarFactory extends VehicleFactory {
    public Car createCar(){
        return new Car();
    }
    
    @Override
    public Moveable create() {
        // TODO Auto-generated method stub
        return new Car();
    }
    }
    
    package com.bjsxt.dp.factory;
    
    public interface Moveable {
        public void run();
    
    }
    
    
    package com.bjsxt.dp.factory;
    
    public class Plane implements Moveable {
    
        @Override
        public void run() {
            System.out.println("飞机正在展翅飞翔");
        }
    
    }
    
    package com.bjsxt.dp.factory;
    //生产飞机的工厂
    public class PlaneFactory extends VehicleFactory{
    public Plane createPlane(){
        return new Plane();
    }
    
    @Override
    public Moveable create() {
        // TODO Auto-generated method stub
        return new Plane();
    }
    }
    
    
    package com.bjsxt.dp.factory;
    
    public class Test {
        public static void main(String[] args) {
            /*Car car = Car.getInstance();
            Car car2 = Car.getInstance();
            if (car == car2) {
                System.out.println("这是同一辆车");
    
            }
            car.run();*/
            
            /*Moveable ma=new Plane();
            ma.run();*/
            
            //通过工厂产生具体的飞机
            /*PlaneFactory pf=new PlaneFactory();
            Plane plane = pf.createPlane();
            plane.run();*/
            
            //使用工厂的方式
            /*VehicleFactory factory=new PlaneFactory();
            Moveable feiji = factory.create();
            feiji.run();*/
            
            VehicleFactory factory=new BroomFactory();
            Moveable feiji = factory.create();
            feiji.run();
        }
    }
    
    package com.bjsxt.dp.factory;
    //生产交通工具的工厂
    public abstract class VehicleFactory {
        public abstract Moveable create();
    
    }
  • 相关阅读:
    svn常用命令
    mysql5.6 sql_mode设置
    centos6.5 mysql5.6主从复制
    linux 挂载windows共享文件夹
    hadoop+hive+hbase+zookeeper安装
    Linux踢出登陆用户的正确姿势
    个人博客项目部署到腾讯云记录(私人记录)
    Python中的单例模式的几种实现方式和优化以及pyc文件解释(转)
    关于window.location.hash的理解及其应用(转)
    Django model反向关联名称的方法(转)
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/9937387.html
Copyright © 2011-2022 走看看