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();

}
复制代码

 

posted on   ~码铃薯~  阅读(123)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示