zoukankan      html  css  js  c++  java
  • 面向对象设计模式

    设计模式

        设计模式是一类问题的最佳解决方法,是面向对象编程人员经过长期总结改良出来的工程化的代码模块。

    设计模式类型

        这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。

        创建型模式:将创建对象的逻辑隐藏起来,不使用new新建对象。包含设计模式有:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。

        结构型模式:积木方式组合接口,定义组合对象,使其获得新的功能。包含设计模式有:适配器模式、桥接模式、过滤器模式、组合模式、装饰器模式、外观模式、享元模式、代理模式。

        行为型模式:责任链模式、命令模式、解释权模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、空对象模式、策略模式、模板模式、访问者模式。

        其他模式J2EE模式:MVC模式、业务代表模式、组合实体模式、数据访问对象模式、前端控制器模式、拦截过滤器模式、服务定位器模式、传输对象模式。

    设计模式六大原则

    1、开闭原则(Open Close Principle)

    开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。

    2、里氏代换原则(Liskov Substitution Principle)

    里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

    3、依赖倒转原则(Dependence Inversion Principle)

    这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

    4、接口隔离原则(Interface Segregation Principle)

    这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。

    5、迪米特法则,又称最少知道原则(Demeter Principle)

    最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

    6、合成复用原则(Composite Reuse Principle)

    合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

    创建型模式

        类对象创建过程中使用到的设计模式

    工厂模式

        定义一个工厂,创建对象在工厂中进行,用户只要知道他需要的什么类型的对象,就可以通过一个对应类型的名字就可以拿到对应类型的对象。

        工厂生产产品有个标准,或者说专利,生产东西的应用方向(Shape接口);

        工厂生产的产品类型,生产东西具体应用(各种类实现Shape接口,例如:Circle、Rectangle类);

        工厂根据订单生产产品(ShapeFactory类),其中订单就是对应产品类型的名字;

    示例:

    工厂产品标准,抽象接口

    Shape.java

    package factoryMode;
    
    public abstract interface Shape {
    
        void draw();
    
    } 

    工厂生产的产品,只需要实现这个接口,满足标准,实现具体功能Square.java

    package factoryMode;
    
    public class Square implements Shape {
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("this is drawing a Square!");
    
        }
    }

    Rectangle.java

    package factoryMode;
    
    public class Rectangle implements Shape {
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("this is drawing a rectangle!");
    
        }
    }

    工厂根据用户订单生产, shapeType就是用户要求生产类型的订单

    Shapefactory.java

    package factoryMode;
    
    /*
    
     * 工厂方法
    
     */
    
    public class ShapeFactory {
    
        public Shape getShape(String shapeType) {
    
            if (shapeType ==null){
    
                return null;
    
            }else {
    
                if (shapeType=="Rectangle") { //获取Rectangle对象
    
                    return new Rectangle();
    
                }else if(shapeType=="Square"){//获取Square对象
    
                    return new Square();
    
                }else if(shapeType=="Circle") {//获取Circle对象
    
                    return new Circle();
    
                }
    
            }
    
            return null;
    
        }
    
    }

    测试main

    factoryDemo.java

    package factoryMode;
    
    /**
    
     * 工厂模式
    
     */
    
    public class factoryDemo {
    
        public static void main(String[] args) {
    
            //获取工厂对象
    
            ShapeFactory fac = new ShapeFactory();
    
            Rectangle re = (Rectangle) fac.getShape("Rectangle");
    
            re.draw();     
    
        }
    
    }

    抽象工厂模式

        工厂模式加强,工厂的不同子工厂能生产不同系列的产品,一个系列下有多个产品。

        工厂生产有多个标准,专利,(Shape接口、Color接口);

        工厂根据专利生产不同系列的产品,实现Shape接口系列产品,实现Color接口系列产品(例如:Red、Circle类)

        工厂的管理部门,管理定义子工厂生产哪个系列产品需要的生产线(AbstractFactory类)

        工厂下的子工厂,可以自己选择可以生产的系列产品(ColorFactory、ShapeFactory类)

        工厂根据用户选择产品系列,选择不同的子工厂(FactoryProducer类)

        工厂根据用户订单生产该系列产品(ColorFactory、ShapeFactory类)

    工厂生产标准,专利,抽象接口

    Shape.java

    package abstractFacMode;
    
    public abstract interface Shape {
    
        void draw();
    
    }

    Color.java

    package abstractFacMode;
    
    public interface Color {
    
        public void fill();
    
    }

    工厂管理子工厂生产产品系列生产线,getColor,getShape两条生产线

    AbstractFactory.java

    package abstractFacMode;
    
    public abstract class AbstractFactory {
    
        public abstract Color getColor(String color);
    
        public abstract Shape getShape(String shape);
    
    }

    工厂下的子工厂

    ShapeFactory.java

    Shape系列生产的子工厂,只需要实现getShape这条生产线

    package abstractFacMode;
    
    public class ShapeFactory extends AbstractFactory {
    
     
    
        @Override
    
        public Color getColor(String color) {
    
            // TODO Auto-generated method stub
    
            return null;
    
        }
    
     
    
        @Override
    
        public Shape getShape(String shape) {
    
            // TODO Auto-generated method stub
    
            if(shape==null) {
    
                return null;
    
            }else if(shape=="Rectangle") {
    
                return new Rectangle();
    
            }else if(shape=="Square") {
    
                return new Square();
    
            }else if(shape=="Circle") {
    
                return new Circle();
    
            }
    
            return null;
    
        }
    }

    ColorFactory.java

    Color系列生产工厂,只实现getColor这条生产线

    package abstractFacMode;
    
    public class ColorFactory extends AbstractFactory {
    
        @Override
    
        public Color getColor(String color) {
    
            // TODO Auto-generated method stub
    
            if (color==null) {
    
                return null;
    
            }else if(color=="Red") {
    
                return new Red();
    
            }else if(color=="Blue") {
    
                return new Blue();
    
            }
    
            return null;
    
        }
    
        @Override
    
        public Shape getShape(String shape) {
    
            // TODO Auto-generated method stub
    
            return null;
    
        }
    }

    根据用户需求,选择子工厂生产对应系列产品

    FactoryProducer.java

    package abstractFacMode;
    
    public class FactoryProducer {
    
        public AbstractFactory getFactory(String choice) {
    
            if(choice==null) {
    
                return null;
    
            }else if(choice=="Shape") {
    
                return new ShapeFactory();
    
            }else if(choice=="Color") {
    
                return new ColorFactory();
    
            }
            return null;
        }
    }

    不同系列的产品

    Shape系列生产的Rectangle产品

    package abstractFacMode;
    
    public class Rectangle implements Shape {
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("this is drawing a rectangle!");
    
        }
    }

    Color系列生产的Red产品

    package abstractFacMode;
    
    public class Red implements Color {
    
        @Override
    
        public void fill() {
    
            // TODO Auto-generated method stub
    
            System.out.println("fill red color!");
    
        }
    }

    测试

    package abstractFacMode;
    
    /*
    
     * 抽象工厂
    
     */
    
    public class AbstractFacDemo {
    
        public static void main(String[] args) {
    
            //获取生产对应系列子工厂对象
    
            AbstractFactory absFac=new FactoryProducer().getFactory("Shape");
    
            Shape s=absFac.getShape("Rectangle");
    
            s.draw();
    
    
            AbstractFactory absFac1=new FactoryProducer().getFactory("Color");
    
            Color c=absFac1.getColor("Red");
    
            c.fill();
        }
    }  

    单例模式

        类只能创建一个对象,并且提供一个方法供全局访问。

    示例:

    饿汉式,通过java类加载机制实现线程安全。在类加载的时候就实例化对象。优点执行效率高,但式类加载时就实例化对象,浪费内存。

    SingleObject.java

    package singleMode;
    
    /*
    
     * 单例模式
    
     * 饿汉式(线程安全),但是可以使用反射创建多个实例
    
     */
    
    public class SingleObject {
    
        //创建SingleObject对象
    
        private static SingleObject instance=new SingleObject();
    
        //私有构造
    
        private SingleObject() {
    
           
    
        }
    
       
    
        public static SingleObject getInstance() {
    
            return instance;
    
        }
    
       
    
        public void showMessage() {
    
            System.out.println("this is singleMode!");
    
        }
    
     
    
    }
    
     
    View Code

    懒汉式,延迟加载,当调用getInstance方法时才实例化对象。当多线程时,线程不安全,会出现实例化出多个对象。

    SingleObject1.java

    package singleMode;
    
    /*
    
     * 单例模式
    
     * 懒汉式,线程不安全
    
     * 将类的实例化延后到方法调用;
    
     */
    
    public class SingleObject1 {
    
        private static SingleObject1 instance;
    
        private SingleObject1() {};
    
       
    
        public static SingleObject1 getInstance() {
    
            if(instance==null) {
    
                instance=new SingleObject1();
    
            }
    
            return instance;
    
        }
    
       
    
        public void showMessage() {
    
            System.out.println("this is lazy single mode !");
    
        }
    
    }
    View Code

    懒汉式,延迟加载,加上同步锁,保证线程安全。但加上锁后执行效率有影响。

    SingleObject2.java

    package singleMode;
    
    /*
    
     * 单例模式
    
     * 懒汉式(线程安全),使用同步锁sychonization
    
     */
    
    public class SingleObject2 {
    
        private static SingleObject2 instance;
    
        //构造函数
    
        private SingleObject2() {};
    
        //获取实例对象
    
        public static synchronized SingleObject2 getInstance() {
    
            if(instance==null) {
    
                instance = new SingleObject2();
    
            }
    
            return instance;
    
        }
    
        public void showMessage() {
    
            System.out.println("this lazy synchronized Single Mode!");
    
        }
    
    }
    View Code

    懒汉式,延迟加载,加上同步锁,保证线程安全。双锁机制在线程安全情况下,保证高性能。

    package singleMode;
    
    /*
    
     *
    
     * 单例模式,
    
     * 懒汉式
    
     * 双锁DCL(线程安全,高效)
    
     */
    
    public class SingleObject3 {
    
        private volatile static SingleObject3 instance;
    
        //私有构造
    
        private SingleObject3() {};
    
       
    
        public static SingleObject3 getInstance() {
    
            if(instance==null) {
    
                synchronized(SingleObject3.class) {
    
                    instance = new SingleObject3();
    
                }
    
            }
    
           
    
            return instance;
    
        }
    
       
    
        public void showMessage() {
    
            System.out.println("this lazy DCL single mode!!!");
    
        }
    
    }
    View Code

    懒汉式,使用静态内部类实现,通过静态域实现延迟加载。这种方式比较饿汉式能够实现延迟加载,比较双锁机制实现更加简单,能够保证线程安全。

    package singleMode;
    
    /*
    
     *
    
     * 单例模式
    
     * 懒汉式,使用静态内部类实现延迟实例化
    
     */
    
    public class SingleObject4 {
    
        private static class InstanceHolder{
    
            private static final SingleObject4 instance = new SingleObject4();
    
        }
    
        private SingleObject4() {};
    
       
    
        public static SingleObject4 getInstance() {
    
            return InstanceHolder.instance;
    
        }
    
       
    
        public void showMessage() {
    
            System.out.println("this is lazy inner class single mode!!!");
    
        }
    
    }
    View Code

    建造者模式

        将复杂对象的构建和他的表示分离。将复杂对象的创建过程进行抽象,通过不同的条件执行相同的创建过程,动态得到不同的对象。

    示例:

    抽象建造者,Builer.java

    package builderMode;
    
    /**
    
     *
    
     * 建造者抽象类
    
     */
    
    public abstract class Builder {
    
        abstract void buildPainter(MyPainter mypaiter);
    
        abstract void buildCanvas(MyCanvas mycanvas);
    
        abstract MyPicture getPicture();
    
    }

    具体实现Builder

    DrawPictureBuilder.java

    package builderMode;
    
    /**
    
     * 具体绘画实现builder
    
    */
    
    public class DrawPictureBuilder extends Builder {
    
       
    
        private MyPicture mypicture = new MyPicture();
    
        @Override
    
        void buildPainter(MyPainter mypainter) {
    
            // TODO Auto-generated method stub
    
            mypicture.setMypainter(mypainter);
    
        }
    
     
    
        @Override
    
        void buildCanvas(MyCanvas mycanvas) {
    
            // TODO Auto-generated method stub
    
            mypicture.setMycanvas(mycanvas);
    
        }
    
     
    
        @Override
    
        MyPicture getPicture() {
    
            // TODO Auto-generated method stub
    
            return mypicture;
    
        }
    
     
    
    }
    View Code

    Director控制者类,控制使用建造者组合出复杂类

    Director.java

    package builderMode;
    
    /**
    
     *
    
     * Director类使用建造者组合出复杂类
    
    */
    
    public class Director {
    
        private Builder builder;
    
        private MyCanvas mycanvas;
    
        private MyPainter mypaiter;
    
       
    
        public Director(Builder builder, MyCanvas mycanvas, MyPainter mypaiter) {
    
            super();
    
            this.builder = builder;
    
            this.mycanvas = mycanvas;
    
            this.mypaiter = mypaiter;
    
        }
    
     
    
        //组装复杂类
    
        public MyPicture constractPic() {
    
            builder.buildCanvas(mycanvas);
    
            builder.buildPainter(mypaiter);
    
            return builder.getPicture();
    
        }
    
    }
    View Code

    用于组合子类

    MyCanvas.java

    package builderMode;
    
     
    
    /**
    
     *
    
     * 画布类
    
    */
    
    public class MyCanvas {
    
        //画布长宽
    
        private int longth;
    
        private int width;
    
       
    
        public MyCanvas(int longth, int width) {
    
            super();
    
            this.longth = longth;
    
            this.width = width;
    
        }
    
        public int getLongth() {
    
            return longth;
    
        }
    
        public void setLongth(int longth) {
    
            this.longth = longth;
    
        }
    
        public int getWidth() {
    
            return width;
    
        }
    
        public void setWidth(int width) {
    
            this.width = width;
    
        }
    
       
    
    }
    View Code

    MyPainter.java

    package builderMode;
    
     
    
    /**
    
     *
    
     * 画笔类
    
    */
    
    public class MyPainter {
    
        //画笔颜色
    
        private String color;
    
        //画笔宽度
    
        private int pwidth;
    
       
    
        public MyPainter(String color, int pwidth) {
    
            super();
    
            this.color = color;
    
            this.pwidth = pwidth;
    
        }
    
       
    
        public String getColor() {
    
            return color;
    
        }
    
        public void setColor(String color) {
    
            this.color = color;
    
        }
    
        public int getPwidth() {
    
            return pwidth;
    
        }
    
        public void setPwidth(int pwidth) {
    
            this.pwidth = pwidth;
    
        }
    
    }
    View Code

    MyPicture.java

    package builderMode;
    
    public class MyPicture {
    
        //画笔
    
        private MyPainter mypainter;
    
        //画布
    
        private MyCanvas mycanvas;
    
       
    
        public MyPicture() {
    
            super();
    
        }
    
        public MyPicture(MyPainter mypainter, MyCanvas mycanvas) {
    
            super();
    
            this.mypainter = mypainter;
    
            this.mycanvas = mycanvas;
    
        }
    
        public MyPainter getMypainter() {
    
            return mypainter;
    
        }
    
        public void setMypainter(MyPainter mypainter) {
    
            this.mypainter = mypainter;
    
        }
    
        public MyCanvas getMycanvas() {
    
            return mycanvas;
    
        }
    
        public void setMycanvas(MyCanvas mycanvas) {
    
            this.mycanvas = mycanvas;
    
        }
    
       
    
        @Override
    
        public String toString() {
    
            // TODO Auto-generated method stub
    
            String str = "画布:"+"long = "+mycanvas.getLongth() +";width = "+mycanvas.getWidth()
    
            +"-----画笔:"+"color = "+mypainter.getColor()+";pwidth = "+mypainter.getPwidth();
    
            return str;
    
        }
    
       
    
    }
    View Code

    测试

    package builderMode;
    
     
    
    /**
    
     * 建造者模式
    
    */
    
    public class BuilderModeDemo {
    
        public static void main(String[] args) {
    
            //创建画图所需元素
    
            MyCanvas mycanvas = new MyCanvas(10,10);
    
            MyPainter mypainter = new MyPainter("red",10);
    
           
    
            //创建建造者对象
    
            Builder builder = new DrawPictureBuilder();
    
            //Director控制组合过程
    
            Director director = new Director(builder,mycanvas,mypainter);
    
           
    
            MyPicture mypicture =  director.constractPic();
    
            System.out.println(mypicture.toString());
    
        }
    
    }
    View Code

     

    原型模式

        原型模式(Prototype mode)用于创建重复对象,同时保证高效。原型模式实现一个接口创建当前对象的克隆,拷贝一个现有对象生成一个新对象,浅拷贝实现Cloneable,重写;深拷贝通过Serializable读取二进制流。

    示例:

    创建一个抽象类或接口实现接口Cloneable,重写clone()方法

    Shape.java

    package PrototypeMode;
    
    //定义抽象类或接口实现Cloneable接口
    
    public abstract class Shape implements Cloneable {
    
        //查找到唯一原型标识
    
        private String id;
    
        private String type;
    
       
    
        //draw方法
    
        public abstract void draw();
    
        public String getId() {
    
            return id;
    
        }
    
     
    
        public void setId(String id) {
    
            this.id = id;
    
        }
    
     
    
        public String getType() {
    
            return type;
    
        }
    
     
    
        public void setType(String type) {
    
            this.type = type;
    
        }
    
     
    
        //重写clone()方法
    
        public Object clone() {
    
            Object clone = null;
    
            try {
    
                clone = super.clone();
    
            } catch (CloneNotSupportedException e) {
    
                // TODO Auto-generated catch block
    
                e.printStackTrace();
    
            }
    
            return clone;
    
        }
    
    }
    View Code

    对应继承抽象类的实体类:

    Circle.java类

    package entry;
    
    import PrototypeMode.Shape;
    
     
    
    //Shape类的实体
    
    public class Circle extends Shape {
    
     
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("draw a circle");
    
        }
    
       
    
    }
    View Code

    Rectangle.java类

    package entry;
    
    import PrototypeMode.Shape;
    
     
    
    public class Rectangle extends Shape {
    
     
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("draw a rectangle");
    
        }
    }
    View Code

    创建一个类保存实体类对象原型,通过这个类获取原型的拷贝

    ShapeCashe.java类

    package PrototypeMode;
    
     
    
    import java.util.Hashtable;
    
    import entry.Circle;
    
    import entry.Rectangle;
    
     
    
    //Shape对象容器类
    
    public class ShapeCache {
    
       
    
        //保存Shape原型对象
    
        private static Hashtable<String,Shape> shapeMap = new Hashtable<String,Shape>();
    
       
    
        //创建获取根据唯一标识获取原型方法
    
        public static Shape getShape(String id) {
    
            //根据唯一标识获取原型
    
            Shape shapetemp = shapeMap.get(id);
    
            //返回原型对象的一个克隆
    
            return (Shape) shapetemp.clone();
    
        }
    
       
    
        //初始化原型对象
    
        public static void loadShape() {
    
            Circle circle = new Circle();
    
            circle.setId("1");
    
            circle.setType("Circle");
    
            shapeMap.put(circle.getId(), circle);
    
           
    
            Rectangle rectangle = new Rectangle();
    
            rectangle.setId("2");
    
            rectangle.setType("Rectangle");
    
            shapeMap.put(rectangle.getId(), rectangle);
    
           
    
        }
    
       
    
    }
    View Code

    测试:

    PrototypeModeDemo.java类

    package PrototypeMode;
    
     
    
    public class PrototypeModeDemo {
    
        public static void main(String[] args) {
    
            //初始化原型表
    
            ShapeCache.loadShape();
    
            //获取clone实例
    
            //根据id,获取对应原型的拷贝
    
            Shape cloneShape = ShapeCache.getShape("1");
    
            System.out.println(cloneShape.toString());
        }
    
    }
    View Code

    适配器模式

        适配器模式(Adapter Mode),不兼容接口之间的桥梁。通过适配器一个类实例使用其他类功能。

    实例:

    播放器接口:

    Player.java类

    package adapterMode;
    
     
    
    //播放器接口
    
    public interface Player {
    
        //传入播放文件类型,文件名
    
        public void play(String filetype,String filename);
    
    }
    View Code

    基本播放器类,只能播放mp4格式文件,

    BasicPlayer.java类

    package adapterMode;
    
     
    
    public class BasicPlayer implements Player {
    
        AdapterPlayer adapterplayer;
    
       
    
        @Override
    
        public void play(String filetype, String filename) {
    
            // TODO Auto-generated method stub
    
            //BasicPlayer只能播放mp4
    
            if(filetype.equalsIgnoreCase("mp4")) {
    
                System.out.println("播放mp4:"+filename);
    
            }else {
    
                //使用其他播放器
    
                if(filetype.equalsIgnoreCase("mp3")||filetype.equalsIgnoreCase("vlc")) {
    
                    //创建适配器
    
                    adapterplayer = new AdapterPlayer(filetype);
    
                    //适配器去调用其他类对象方法
    
                    adapterplayer.play(filetype, filename);
    
                }else {
    
                    System.out.println("不支持格式!");
    
                }
            }
        }
    }
    View Code

    其他先进播放器接口,拥有MP3和vlc格式播放功能:

    AdvancePlayer.java类

    package adapterMode;
    
    //先进播放器
    
    public interface AdvancePlayer {
    
        public void playVlc(String filename);
    
        public void playMp3(String filename);
    
    }
    View Code

    实现先进播放器的实体类:

    MP3Player.java类,播放MP3文件

    package adapterMode;
    
    public class Mp3Player implements AdvancePlayer {
    
        @Override
    
        public void playVlc(String filename) {
    
            // TODO Auto-generated method stub
        }
        @Override
    
        public void playMp3(String filename) {
    
            // TODO Auto-generated method stub
    
            System.out.println("播放Mp3:"+filename);
    
        }
    }
    
     
    View Code

    VlcPlayer.java类,播放VLC格式文件

    package adapterMode;
    
    public class VlcPlayer implements AdvancePlayer {
    
     
    
        @Override
    
        public void playVlc(String filename) {
    
            // TODO Auto-generated method stub
    
            System.out.println("播放Vlc:"+filename);
    
        }
    
     
    
        @Override
    
        public void playMp3(String filename) {
    
            // TODO Auto-generated method stub
    
     
    
        }
    
     
    
    }
    View Code

    创建适配器类,让BasicPlayer可以使用MP3Player和VLCPlayer播放器的功能。

    AdapterPlayer.java类,实现Player接口。

    package adapterMode;
    
     
    
    public class AdapterPlayer implements Player {
    
       
    
        AdvancePlayer advancePlayer;
    
       
    
        //根据文件类型,选择实例化对应advancePlayer
    
        public AdapterPlayer(String filetype) {
    
            if (filetype.equalsIgnoreCase("vlc")) {
    
                advancePlayer = new VlcPlayer();
    
            }else if(filetype.equalsIgnoreCase("mp3")) {
    
                advancePlayer = new Mp3Player();
    
            }
    
        }
    
       
    
        //调用advancePlayer的不同实例方法
    
        @Override
    
        public void play(String filetype, String filename) {
    
            // TODO Auto-generated method stub
    
            if (filetype.equalsIgnoreCase("vlc")) {
    
                advancePlayer.playVlc(filename);;
    
            }else if(filetype.equalsIgnoreCase("mp3")) {
    
                advancePlayer.playMp3(filename);;
    
            }
    
        }
    
     
    
    }
    View Code

    测试:

    package adapterMode;
    
    //测试
    
    public class AdapterModeDemo {
    
        public static void main(String[] args) {
    
            BasicPlayer basicplayer = new BasicPlayer();
    
            //调用自己的功能
    
            basicplayer.play("mp4", "hello.mp4");
    
            //通过adapter,调用advanceplayer的播放器
    
            basicplayer.play("vlc", "welcome.vlc");
    
        }
    
    }
    View Code

    桥接模式

        桥接模式(Bridge Mode),将实体类的功能独立出来,抽象成一个通用的Bridge接口。将实体和功能实现分离,实现不同功能。通过Brideg接口,传入不同功能Bridge接口的实现类,实现调用不同功能。

    实例:

    创建一个抽象的功能接口,

    Bridge.java类

    package bridgeMode;
    
     
    
    //桥接Bridge接口,连接定义与功能桥梁
    
    //不同功能的接口
    
    public interface Bridge {
    
        public void draw();
    
    }
    View Code

    不同的功能,实现bridge接口的类,重写方法

    RedDraw.java类

    package bridgeMode;
    
     
    
    public class RedDraw implements Bridge {
    
     
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("draw red");
    
        }
    
     
    
    }
    View Code

    YellowDraw.java类

    package bridgeMode;
    
     
    
    public class YellowDraw implements Bridge {
    
     
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("draw yellow");
    
        }
    
     
    
    }
    View Code

    对应实体类父类,拥有Bridge接口类型属性

    Painter.java类

    package bridgeMode;
    
     
    
    //实体的父类,拥有属性:bridge接口对象
    
    //画笔父类
    
    public abstract class Painter {
    
        //子类需要访问到父类属性、构造
    
        protected Bridge bridge;
    
       
    
        protected Painter(Bridge bridge) {
    
            this.bridge = bridge;
    
        }
    
        public abstract void drawPic();
    
    }
    View Code

    具体实体类子类

    BasicPainter.java类

    package bridgeMode;
    
     
    
    //实体的子类,通过功能接口Bridge对象实现不同功能
    
    public class BasicPainter extends Painter {
    
        public BasicPainter(Bridge bridge) {
    
            //调用父类的构造,赋值
    
            super(bridge);
    
        }
    
       
    
        @Override
    
        public void drawPic() {
    
            // TODO Auto-generated method stub
    
            //通过bridge,根据不同实现bridge接口的功能类,实现功能和实体分离
    
            bridge.draw();
    
        }
    
     
    
    }
    View Code

    测试:

    package bridgeMode;
    
    //桥接模式
    
    //测试
    
    public class BridgeModeDemo {
    
        public static void main(String[] args) {
    
            //调用不同实现
    
            BasicPainter basicPainter = new BasicPainter(new RedDraw());
    
            basicPainter.drawPic();
    
            basicPainter = new BasicPainter(new YellowDraw());
    
            basicPainter.drawPic();
    
        }
    }
    View Code

    过滤器模式

        过滤器模式(Filter Mode),通过不同的接口实现不同标准的对一组对象进行过滤处理。

    示例:

    过滤器接口标准

    Filter.java类

    package filterMode;
    
     
    
    import java.util.List;
    
     
    
    //过滤器接口
    
    public interface Filter {
    
        //过滤方法
    
        public List<People> filtObject(List<People> lists);
    
    }
    View Code

    实现接口类,不同的过滤条件

    FilterAge.java对年龄进行过滤

    package filterMode;
    
     
    
    import java.util.ArrayList;
    
    import java.util.List;
    
     
    
    public class FilterAge implements Filter {
    
     
    
        @Override
    
        public List<People> filtObject(List<People> lists) {
    
            // TODO Auto-generated method stub
    
            List<People> peopleup50 = new ArrayList<People>();
    
            for (People people:lists) {
    
                //将age大于50放入列表
    
                if (people.getAge()>50){
    
                    peopleup50.add(people);
    
                }
    
            }
            return peopleup50;
    
        }
    
    }
    View Code

    FilterAddr.java类,对地址过滤

    package filterMode;
    
     
    
    import java.util.ArrayList;
    
    import java.util.List;
    
     
    
    public class FilterAddr implements Filter {
    
     
    
        @Override
    
        public List<People> filtObject(List<People> lists) {
    
            // TODO Auto-generated method stub
    
            List<People> peopleaddr = new ArrayList<People>();
    
            for(People people:lists) {
    
                //将地址四川的筛选出来
    
                if (people.getAddr().equalsIgnoreCase("四川")) {
    
                    peopleaddr.add(people);
    
                }
    
            }
    
            return peopleaddr;
    
        }
    
     
    
    }
    View Code

    FilterComponent.java组合条件过滤

    package filterMode;
    
     
    
    import java.util.List;
    
     
    
    //组合条件过滤
    
    public class FilterComponent implements Filter {
    
        private Filter filter1;
    
        private Filter filter2;
    
       
    
        public FilterComponent(Filter filter1,Filter filter2) {
    
            this.filter1 = filter1;
    
            this.filter2 = filter2;
    
        }
    
       
    
        @Override
    
        public List<People> filtObject(List<People> lists) {
    
            // TODO Auto-generated method stub
    
            //同时满足两个条件
    
            //使用条件1过滤
    
            List<People> peoples1 = filter1.filtObject(lists);
    
            //然后将过滤后的使用条件2过滤
    
            List<People> peoples2 = filter2.filtObject(peoples1);
    
            return peoples2;
    
        }
    
    }
    View Code

    过滤的实体类:

    People.java类

    package filterMode;
    
     
    
    //实体类people
    
    public class People {
    
        private String name;
    
        private int age;
    
        private String addr;
    
       
    
       
    
        public People(String name, int age, String addr) {
    
            super();
    
            this.name = name;
    
            this.age = age;
    
            this.addr = addr;
    
        }
    
        public String getName() {
    
            return name;
    
        }
    
        public void setName(String name) {
    
            this.name = name;
    
        }
    
        public int getAge() {
    
            return age;
    
        }
    
        public void setAge(int age) {
    
            this.age = age;
    
        }
    
        public String getAddr() {
    
            return addr;
    
        }
    
        public void setAddr(String addr) {
    
            this.addr = addr;
    
        }
    
    }
    View Code

    测试

    package filterMode;
    
     
    
    import java.util.ArrayList;
    
    import java.util.List;
    
     
    
    //测试
    
    public class FilterModeDemo {
    
        public static void main(String[] args) {
    
            List<People> peoples = new ArrayList<People>();
    
            People people = new People("tom",11,"四川");
    
            peoples.add(people);
    
            people = new People("li",45,"云南");
    
            peoples.add(people);
    
            people = new People("wom",61,"四川");
    
            peoples.add(people);
    
            people = new People("tm",11,"北京");
    
            peoples.add(people);
    
           
    
            //过滤年龄过滤器
    
            Filter filtAge = new FilterAge();
    
            filtAge.filtObject(peoples);
    
            //过滤地址过滤器
    
            Filter filtAddr = new FilterAddr();
    
            filtAddr.filtObject(peoples);
    
            //组合过滤器
    
            Filter filtComp = new FilterComponent(filtAge,filtAddr);
    
            filtComp.filtObject(peoples);
    
        }
    
    }
    View Code

    组合模式

        组合模式(Composite Mode),将对象组合成类似树形结构,表现对象之间的关系。类中拥有保存该类对象的列表的属性,用来构建类对象之间的关系,形成树形结构。

    示例:

    员工类Employee.java,不同员工拥有不同职级,下辖管理不同员工。

    package compositeMode;
    
     
    
    import java.util.ArrayList;
    
    import java.util.List;
    
     
    
    //员工类
    
    public class Employee {
    
        //姓名
    
        private String name;
    
        //年龄
    
        private int age;
    
        //职位
    
        private String position;
    
        //下辖员工
    
        private List<Employee> employeelists;
    
        //构造方法
    
        public Employee(String name, int age, String position) {
    
            super();
    
            this.name = name;
    
            this.age = age;
    
            this.position = position;
    
            this.employeelists = new ArrayList<Employee>();
    
        }
    
        //get set方法
    
        public String getName() {
    
            return name;
    
        }
    
        public void setName(String name) {
    
            this.name = name;
    
        }
    
        public int getAge() {
    
            return age;
    
        }
    
        public void setAge(int age) {
    
            this.age = age;
    
        }
    
        public String getPosition() {
    
            return position;
    
        }
    
        public void setPosition(String position) {
    
            this.position = position;
    
        }
    
       
    
        //将下辖职员加入
    
        public void add(Employee employee) {
    
            this.employeelists.add(employee);
    
        }
    
        //根据名称移除职员
    
        public void remove(Employee employee) {
    
            this.employeelists.remove(employee);
    
        }
    
    }
    View Code

    测试:

    package compositeMode;
    
     
    
    public class CompositeModeDemo {
    
        public static void main(String[] args) {       
    
     
    
            //CEO,类似树根结点
    
            Employee employee = new Employee("tom",31,"CEO");
    
            Employee employee1 = new Employee("li",33,"SA Manager");
    
            Employee employee2 = new Employee("li",43,"SA1");
    
            Employee employee3 = new Employee("li",23,"SA2");
    
           
    
            //构建关系
    
            employee.add(employee1);
    
            employee1.add(employee2);
    
            employee1.add(employee3);
    
        }
    
    }
    View Code

    装饰器模式

        装饰器模式(Decorator Mode),在不改变现有对象结构情况下,为对象添加新的功能。

    示例:

    抽象接口被装饰,实现这一接口的类都可以传入装饰器类

    Shape.java接口

    package decratorMode;
    
     
    
    //抽象接口,被装饰
    
    public interface Shape {
    
        public void draw();
    
    }
    View Code

    实现Shape接口的实体类:

    Circle.java类

    package decratorMode;
    
    //实体类,实现Shape接口
    
    public class Circle implements Shape {
    
     
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("draw circle");
    
        }
    
     
    
    }
    View Code

    Rectangle.java类

    package decratorMode;
    
    //实体类,实现Shape接口
    
    public class Rectangle implements Shape {
    
     
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("draw rectangle");
    
        }
    
     
    
    }
    View Code

    装饰器类,定义一个抽象的装饰器父类,实现Shape接口

    ShapeDecrator.java类

    package decratorMode;
    
    //装饰器抽象类,父类
    
    public abstract class ShapeDecrator implements Shape {
    
        protected Shape decShape;
    
        public ShapeDecrator(Shape shape) {
    
            this.decShape = shape;
    
        }
    
       
    
        public void draw() {
    
            this.decShape.draw();
    
        }
    
    }
    View Code

    具体装饰器实现类,将Shape的实体类传入,执行原有逻辑和装饰逻辑

    package decratorMode;
    
     
    
    //实现具体装饰逻辑
    
    public class RedShapeDecrator extends ShapeDecrator {
    
        public RedShapeDecrator(Shape decShape) {
    
            super(decShape);
    
        }
    
       
    
        public void draw() {
    
            System.out.println("Red装饰逻辑");
    
            decShape.draw();
    
            System.out.println("Red装饰逻辑");
    
        }
    
    }
    View Code

    测试:

    package decratorMode;
    
    //测试
    
    public class DecratorModeDemo {
    
        public static void main(String[] args) {
    
            Circle circle = new Circle();
    
            RedShapeDecrator reddec = new RedShapeDecrator(new Circle());
    
            RedShapeDecrator reddec1 = new RedShapeDecrator(new Rectangle());
    
           
    
            circle.draw();
    
            reddec.draw();
    
            reddec1.draw();
    
        }
    
    }
    View Code

     

    外观模式

        外观模式(Façade Mode),将复杂系统隐藏起来,直接提供一个整合的外部接口供用户调用。用户不用了解系统内部复杂逻辑关系。

    示例 :

    模拟内部复杂逻辑接口

    Shape.java类

    package facadeMode;
    
    //Shape接口
    
    public interface Shape {
    
        public void draw();
    
    }
    View Code

    实现Shape接口实体类:

    package facadeMode;
    
    //实现Shape接口实体类
    
    public class Circle implements Shape {
    
     
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("draw circle");
    
        }
    
     
    
    }
    View Code
    package facadeMode;
    
    //实现Shape接口实体类
    
    public class Rectangle implements Shape {
    
     
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("draw rectangle");
    
        }
    
     
    
    }
    View Code

    提供给用户统一访问复杂内部逻辑接口:

    ShapeMaker.java类

    package facadeMode;
    
    //用户接口类,直接提供给用户访问Shape功能集合接口
    
    public class ShapeMaker {
    
        //circle类对象
    
        private Shape circle;
    
        //rectangle类对象
    
        private Shape rectangle;
    
        public ShapeMaker() {
    
            circle = new Circle();
    
            rectangle = new Rectangle();
    
        }
    
       
    
        //提供给用户的接口方法
    
        public void drawCircle() {
    
            circle.draw();
    
        }
    
        public void drawRectangle() {
    
            rectangle.draw();
    
        }
    
    }
    View Code

    测试:

    package facadeMode;
    
    //测试
    
    public class FacadeModeDemo {
    
        public static void main(String[] args) {
    
            //直接使用ShapeMaker类对象获取Shape接口类型类对象功能
    
            ShapeMaker shapeMaker = new ShapeMaker();
    
            shapeMaker.drawCircle();
    
            shapeMaker.drawRectangle();
    
        }
    
    }
    View Code

    享元模式

        享元模式(Flyweight Mode),主要用来减少重复对象的创建,增加对象重用,减少内存占用。

    示例:

    Shape.java,抽象接口

    package flyweightMode;
    
    //Shape接口
    
    public interface Shape {
    
        public void draw();
    
    }
    View Code

    实现Shape接口实体类

    Circle.java

    package flyweightMode;
    
    //实现shape接口实体类
    
    public class Circle implements Shape {
    
        private String color;
    
        //构造
    
        public Circle(String color) {
    
            this.setColor(color);
    
        }
    
        @Override
    
        public void draw() {
    
            // TODO Auto-generated method stub
    
            System.out.println("draw Circle,color:"+this.color);
    
        }
    
        public String getColor() {
    
            return color;
    
        }
    
        public void setColor(String color) {
    
            this.color = color;
    
        }
    
    }
    View Code

    创建一个工厂类,保存已经创建的实体类对象,获取已经创建的重用实体类对象或创建一个新类对象。

    ShapeFactory.java
    
    package flyweightMode;
    
    import java.util.HashMap;
    
    //工厂类,保存现有的Shape对象,获取新的Shape对象或可重用的Shape对象
    
    public class ShapeFactory {
    
        private static HashMap<String,Shape> circleMap = new HashMap<>();
    
        //获取指定color的Circle
    
        public static Shape getCircle(String color) {
    
            Circle circle = (Circle) circleMap.get(color);
    
            if (circle == null){
    
                circle = new Circle(color);
    
                circleMap.put(color, circle);
    
            }
    
            return circle;
    
        }
    
    }
    View Code

    测试:

    package flyweightMode;
    
    //测试享元模式
    
    public class FlyweightModeDemo {
    
        public static void main(String[] args) {
    
            ShapeFactory shapefac = new ShapeFactory();
    
            Circle circle = (Circle) shapefac.getCircle("yellow");
    
            System.out.println(circle);
    
            circle.draw();
    
            circle = (Circle) shapefac.getCircle("red");
    
            System.out.println(circle);
    
            circle.draw();
    
            //使用的还是之前的对象,color为yellow
    
            circle = (Circle) shapefac.getCircle("yellow");
    
            System.out.println(circle);
    
            circle.draw();
        }
    
    }
    View Code

    代理模式

        为一个类额外添加一层访问控制逻辑,用另一个类包装被代理类。

    示例:

    Image接口

    Image.java

    package proxyMode;
    
    //定义Image接口
    
    public interface Image {
    
        public void show();
    
    }
    View Code

    被代理类

    SourceImage.java类

    package proxyMode;
    
    //被代理类
    
    public class SourceImage implements Image {
    
        @Override
    
        public void show() {
    
            // TODO Auto-generated method stub
    
            System.out.println("source show Image");
    
        }
    
    }
    View Code

    代理类

    ProxyImage.java类

    package proxyMode;
    
    //代理类,对SourceImage类添加访问控制
    
    public class ProxyImage implements Image {
    
        private SourceImage sourceImg;
    
       
    
        //代理类添加访问控制
    
        @Override
    
        public void show() {
    
            // TODO Auto-generated method stub
    
            //source类对象不存在,创建,已经存在使用已有的
    
            if (sourceImg ==null){
    
                sourceImg = new SourceImage();
    
            }else {
    
                System.out.println("proxy image show");
    
            }
    
        }
    
    }
    View Code

    动态代理示例:

    JDK自带代理,需要实现相同接口

    Image接口

    package DynProxy;
    
    //image接口
    
    public interface Image {
    
        public void show();
    
    }
    View Code

    被代理类sourceImage

    SourceImage.java类

    package DynProxy;
    
    import DynProxy.Image;
    
    public class SourceImage implements Image {
    
     
    
        @Override
    
        public void show() {
    
            // TODO Auto-generated method stub
    
            System.out.println("souce image show");
    
        }
    
    }
    View Code

    代理类和处理器

    package DynProxy;
    
     
    
    import java.lang.reflect.InvocationHandler;
    
    import java.lang.reflect.Method;
    
     
    
    //代理类和处理器
    
    public class DynProxyHandler implements InvocationHandler {
    
        private SourceImage sourceImg;
    
        public DynProxyHandler(SourceImage sourceImg) {
    
            this.sourceImg = sourceImg;
    
        }
    
        @Override
    
        public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
    
            // TODO Auto-generated method stub
    
            System.out.println("代理逻辑");
    
            //代理调用原处理逻辑
    
            arg1.invoke(sourceImg, arg2);
    
            return null;
    
        }
    
    }
    View Code

    测试使用代理调用功能

    package DynProxy;
    
    import java.lang.reflect.Proxy;
    
     
    
    public class DynProxyDemo {
    
        public static void main(String[] args) {
    
            //创建处理器对象
    
            DynProxyHandler handler = new DynProxyHandler(new SourceImage());
    
            //创建代理类对象
    
            Image proxyImage = (Image) Proxy.newProxyInstance(
    
                    handler.getClass().getClassLoader(),
    
                    new Class[] {Image.class},
    
                    handler);
    
            //使用代理类对象调用方法
    
            proxyImage.show(); 
    
           
    
        }
    
    }
    View Code

    责任链模式

        责任链模式:将同一个请求交给多个类对象处理,这些类对象连接成一条链,链上每个对象都有机会处理这个请求。每个处理的类都拥有对下一个处理者的引用。

    示例:

    打印不同级别的log

    logging.java抽象类

    package responseChainMode;
    
     
    
    //日志抽象类
    
    public abstract class Logging {
    
        // 日志打印级别
    
        public static int INFO = 1;
    
        public static int DEBUG = 2;
    
        public static int ERROR = 3;
    
     
    
        protected int level;
    
        // 责任链下一个
    
        protected Logging nextLogging;
    
     
    
        // 设置下一个责任链节点
    
        public void setNextLogging(Logging nextLogging) {
    
            this.nextLogging = nextLogging;
    
        }
    
     
    
        public void logMessage(int level, String message) {
    
            // 如果
    
            if (this.level <= level) {
    
                write(message);
    
            }
    
            // 如果有下一个节点,再调用logMessage方法
    
            if (nextLogging != null) {
    
                nextLogging.logMessage(level, message);
    
            }
    
        }
    
     
    
        // 输出log
    
        abstract protected void write(String message);
    
    }
    View Code

    错误级别的log类

    ErrorLogging.java类

    package responseChainMode;
    
    public class ErrorLogging extends Logging {
    
        // 设置level
    
        public ErrorLogging() {
    
            this.level = Logging.ERROR;
    
        }
    
     
    
        @Override
    
        protected void write(String message) {
    
            // TODO Auto-generated method stub
    
            System.out.println("error logging:" + message);
    
        }
    
    }
    View Code

    Debug级别的log类

    DebugLogging.java类

    package responseChainMode;
    
    public class DebugLogging extends Logging {
    
        // 设置level
    
        public DebugLogging() {
    
            this.level = Logging.DEBUG;
    
        }
    
     
    
        @Override
    
        protected void write(String message) {
    
            // TODO Auto-generated method stub
    
            System.out.println("debug logging:" + message);
    
        }
    
     
    
    }
    View Code

    提示级别的Logging

    InfoLogging.java类

    package responseChainMode;
    
    public class InfoLogging extends Logging {
    
     
    
        // 设置level
    
        public InfoLogging() {
    
            this.level = Logging.INFO;
    
        }
    
     
    
        @Override
    
        protected void write(String message) {
    
            // TODO Auto-generated method stub
    
            System.out.println("info logging:" + message);
    
        }
    
     
    
    }
    View Code

    测试责任链模式

    package responseChainMode;
    
    public class ResponseChainModeDemo {
    
     
    
        public static Logging getLoggingChain() {
    
            Logging errorLogging = new ErrorLogging();
    
            Logging debugLogging = new DebugLogging();
    
            Logging infoLogging = new InfoLogging();
    
     
    
            // 构建责任链
    
            errorLogging.setNextLogging(debugLogging);
    
            debugLogging.setNextLogging(infoLogging);
    
            // 返回责任链
    
            return errorLogging;
    
        }
    
     
    
        public static void main(String[] args) {
    
            Logging loggingChain = getLoggingChain();
    
            // debug级别,debug及以下节点响应
    
            loggingChain.logMessage(Logging.DEBUG, "debug,some message");
    
            // error级别,所有处理节点都响应
    
            loggingChain.logMessage(Logging.ERROR, "error,some message");
    
        }
    
    }
    View Code

    命令模式

        命令模式(Command Mode)将具体处理的逻辑请求包装成命令,命令调用类直接调用命令,具体处理还是调用的请求类中方法。命令模式将请求和处理逻辑分开,实现松耦合。

    示例:

    Request.java类,具体请求逻辑

    package commandMode;
    
    //请求对象,具体逻辑
    
    public class Request {
    
        public void sayHello() {
    
            System.out.println("say hello");
    
        }
    
        public void sayBye() {
    
            System.out.println("say bye");
    
        }
    
    }
    View Code

    Command接口,命令接口类

    package commandMode;
    
    //命令接口
    
    public interface Command {
    
        //执行请求逻辑
    
        public void excute();
    
    }
    View Code

    Command具体接口实现,调用Request不同逻辑:

    HelloCommand.java类

    package commandMode;
    
    //命令command实现类,调用Request具体方法
    
    public class HelloCommand implements Command {
    
        private Request req;
    
        public HelloCommand(Request request) {
    
            this.req = request;
    
        }
    
        @Override
    
        public void excute() {
    
            // TODO Auto-generated method stub
    
            req.sayHello();
    
        }
    
    }
    View Code

    CommandList.java类,提供给用户的调用Command的入口:

    package commandMode;
    
    import java.util.ArrayList;
    
    import java.util.List;
    
    //命令调用的接口类
    
    public class CommandList {
    
        //命令列表
    
        private List<Command> commands = new ArrayList<Command>();
    
        //添加命令
    
        public void addCommand(Command command) {
    
            commands.add(command);
    
        }
    
        public void excCommand() {
    
            //执行所有命令
    
            for(Command command:commands) {
    
                command.excute();
    
            }
    
            //清空命令列表
    
            commands.clear();
    
        }
    
    }
    View Code

    测试:

    package commandMode;
    
    //命令模式测试
    
    public class CommandModeDemo {
    
        public static void main(String[] args) {
    
            //创建请求
    
            Request req = new Request();
    
            //包装成命令
    
            Command com = new HelloCommand(req);
    
            //将命令放入命令列表,提供给用户调用命令接口
    
            CommandList coms = new CommandList();
    
            coms.addCommand(com);
    
            //执行命令列表
    
            coms.excCommand();
    
        }
    
    }
    View Code

    迭代器模式

        迭代器模式(Iterator Mode),提供一种新的方法遍历聚合对象。聚合对象本身可以遍历自身包含元素,迭代器模式将这种遍历交给Iterator来实现。

    示例:

    Iterator接口

    package iteratorMode;
    
    //迭代器接口
    
    public interface Iterator {
    
        //判断是否有下一个元素
    
        public boolean hasNext();
    
        //获取下一个元素
    
        public Object next();
    
    }
    View Code

    Container.java类,获取迭代器的接口

    package iteratorMode;
    
    //获取迭代器
    
    public interface Container {
    
        //获取迭代器
    
        public Iterator getIterator();
    
    }
    View Code

    Container的实现类,拥有内部类实现Iterator接口,遍历类中聚合属性值

    package iteratorMode;
    
    //Container实现类
    
    public class StringContainer implements Container {
    
        public String lists[] = {"hello","welcome"};
    
        @Override
    
        public Iterator getIterator() {
    
            // TODO Auto-generated method stub
    
            return new StringIterator();
    
        }
    
       
    
        //内部类,实现Iterator接口
    
        public class StringIterator implements Iterator {
    
           
    
            int index;
    
            @Override
    
            public boolean hasNext() {
    
                // TODO Auto-generated method stub
    
                if (index<lists.length) {
    
                    return true;
    
                }
    
                return false;
    
            }
    
       
    
            @Override
    
            public Object next() {
    
                // TODO Auto-generated method stub
    
                if(this.hasNext()) {
    
                    return lists[index++];
    
                }
    
                return null;
    
            }
    
        }
    
    }
    View Code

    测试

    package iteratorMode;
    
    //测试迭代器模式
    
    public class IteratorModeDemo {
    
        public static void main(String[] args) {
    
            StringContainer strContainer = new StringContainer();
    
            Iterator ite =  strContainer.getIterator();
    
            while (ite.hasNext()) {
    
                String str = (String) ite.next();
    
                System.out.println(str);
    
            }
    
        }
    
    }
    View Code
  • 相关阅读:
    基于RBAC的权限设计模型
    RBAC用户权限管理数据库设计
    系统多语言实践(二)
    多语言系统的数据库设计
    系统多语言实践(一)
    企业后台模板
    MYSQL
    JS,Jquery
    BootStrap
    KindEditor
  • 原文地址:https://www.cnblogs.com/tangToms/p/12677686.html
Copyright © 2011-2022 走看看