行为型模型 迭代器模式

行为型模型 迭代器模式

 

 GOOD:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示。 

为遍历不同的聚集结构提供如开始,下一个,是否结束,当前一项等统一接口。

 

 

 

Iterator(迭代器接口):
        该接口必须定义实现迭代功能的最小定义方法集
        比如提供hasNext()和next()方法。
ConcreteIterator(迭代器实现类):
        迭代器接口Iterator的实现类。可以根据具体情况加以实现。
Aggregate(容器接口):
        定义基本功能以及提供类似Iterator iterator()的方法。
concreteAggregate(容器实现类):
        容器接口的实现类。必须实现Iterator iterator()方法。

 

/**
 * 行为型模型 迭代器模式
 * Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。
 *
 */

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>

typedef int Object;
#define SIZE 5

class MyIterator
{
public:
    virtual void First() = 0;
    virtual void Next() = 0;
    virtual bool IsDone() = 0;
    virtual Object Currentitem() = 0;
    virtual ~MyIterator() {}
};

class Aggregate
{
public:
    virtual Object getItem(int index) = 0;
    virtual MyIterator *CreateIterator() = 0;
    virtual int getSize() = 0;
    virtual ~Aggregate() {}
};

class ContreteIierator: public MyIterator
{
public:
    ContreteIierator(Aggregate *ag)
    {
        _ag = ag;
        _idx = 0;
    }
    ~ContreteIierator()
    {
        _ag = nullptr;
        _idx = 0;
    }
    virtual void First() override
    {
        _idx = 0;
    }
    virtual void Next() override
    {
        if (_idx < _ag->getSize())
        {
            _idx++;
        }
    }
    virtual bool IsDone() override
    {
        return (_idx == _ag->getSize());
    }
    virtual Object Currentitem() override
    {
        return _ag->getItem(_idx);
    }
private:
    int _idx;
    Aggregate * _ag;
};

class ConcreateAggregate: public Aggregate
{
public:
    ConcreateAggregate()
    {
        for (int i = 0; i < SIZE; i++)
        {
            object[i] = i+1;
        }
    }
    ~ConcreateAggregate()
    {
        for (int i = 0; i < SIZE; i++)
        {
            object[i] = 0;
        }
    }
    virtual Object getItem(int index) override
    {
        return object[index];
    }
    virtual MyIterator *CreateIterator() override
    {
        return new ContreteIierator(this);
    }
    virtual int getSize() override
    {
        return SIZE;
    }

private:
    Object object[SIZE];
};


void mytest()
{
    // 创建一个集合
    Aggregate *ag = new ConcreateAggregate();
    // 创建一个遍历这个集合的迭代器
    MyIterator *it = ag->CreateIterator();

    // 通过迭代器遍历集合
    for (; !(it->IsDone()); it->Next())
    {
        std::cout << it->Currentitem() << " ";
    }
    std::cout << std::endl;

    // 清理相关资源
    delete it;
    delete ag;

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 单例模式 单例模式是一种创建设计模式,用于确保类只有一个实例,并提供全局访问点。 ```java public class Singleton { private static Singleton instance; //私有化静态对象 private Singleton(){} //私有化构造方法 public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } } ``` 解释:Singleton类只有一个私有的静态实例对象instance,构造方法也是私有的,提供了一个getInstance()方法用于获取该实例,若实例不存在则创建一个新的实例,否则直接返回该实例。 2. 工厂模式 工厂模式是一种创建设计模式,用于将对象的创建和使用分离开来。 ```java public interface Shape { void draw(); } public class Circle implements Shape { @Override public void draw() { System.out.println("Circle.draw()"); } } public class Square implements Shape { @Override public void draw() { System.out.println("Square.draw()"); } } public class ShapeFactory { public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); } else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } } ``` 解释:Shape是一个接口,Circle和Square都实现了该接口,并实现了draw()方法。ShapeFactory是一个工厂类,根据传入的参数shapeType来创建对应的对象。 3. 观察者模式 观察者模式是一种行为设计模式,用于在对象间定义一种一对多的依赖关系,使得一个对象状态的改变能够自动通知并更新其他对象。 ```java public interface Observer { void update(String message); } public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } public class MessageBoard implements Subject { List<Observer> observers = new ArrayList<>(); @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update("New message on the board!"); } } } public class User implements Observer { String name; public User(String name) { this.name = name; } @Override public void update(String message) { System.out.println(name + " got the message: " + message); } } ``` 解释:Observer是观察者接口,定义了update()方法;Subject是主题接口,定义了注册、删除和通知观察者的方法;MessageBoard是一个具体主题类,维护了一个观察者列表,实现了Subject接口;User是观察者类,实现了Observer接口,具有更新方法。 4. MVC模式 MVC模式是一种架构设计模式,用于将应用程序分为三个主要部分:模型、视图和控制器。 ```java public class Model { private int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; } } public class View { public void display(int value){ System.out.println("Value: " + value); } } public class Controller { private Model model; private View view; public Controller(Model model, View view) { this.model = model; this.view = view; } public void setValue(int value){ model.setValue(value); view.display(model.getValue()); } } ``` 解释:Model是数据模型,定义了数据的行为;View是用户界面,显示数据和接收用户输入;Controller是控制器,根据用户输入来更新模型并更新视图。 5. 装饰器模式 装饰器模式是一种结构设计模式,用于动态地将责任附加到对象上。 ```java public interface Shape { void draw(); } public class Circle implements Shape { @Override public void draw() { System.out.println("Circle.draw()"); } } public abstract class ShapeDecorator implements Shape { protected Shape decoratedShape; public ShapeDecorator(Shape decoratedShape) { this.decoratedShape = decoratedShape; } public void draw(){ decoratedShape.draw(); } } public class RedShapeDecorator extends ShapeDecorator { public RedShapeDecorator(Shape decoratedShape) { super(decoratedShape); } public void draw() { decoratedShape.draw(); setColor(decoratedShape); } private void setColor(Shape decoratedShape){ System.out.println("Color: Red"); } } ``` 解释:Shape是一个接口,Circle实现了该接口并实现了draw()方法;ShapeDecorator是一个装饰器抽象类,维护了一个Shape对象,实现了Shape接口并定义了draw()方法;RedShapeDecorator是一个具体装饰器类,扩展了ShapeDecorator,添加了setColor()方法来为Shape对象添加颜色。 6. 适配器模式 适配器模式是一种结构设计模式,用于将一个类的接口转换为另一个接口,以便于在不同类之间进行交互。 ```java public interface MediaPlayer { void play(String audioType, String fileName); } public interface AdvancedMediaPlayer { void playVlc(String fileName); void playMp4(String fileName); } public class VlcPlayer implements AdvancedMediaPlayer { @Override public void playVlc(String fileName) { System.out.println("Playing vlc file. Name: " + fileName); } @Override public void playMp4(String fileName) { // Do nothing } } public class Mp4Player implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { // Do nothing } @Override public void playMp4(String fileName) { System.out.println("Playing mp4 file. Name: "+ fileName); } } public class MediaAdapter implements MediaPlayer { AdvancedMediaPlayer advancedMediaPlayer; public MediaAdapter(String audioType){ if(audioType.equalsIgnoreCase("vlc") ){ advancedMediaPlayer = new VlcPlayer(); } else if (audioType.equalsIgnoreCase("mp4")){ advancedMediaPlayer = new Mp4Player(); } } public void play(String audioType, String fileName) { if(audioType.equalsIgnoreCase("vlc")){ advancedMediaPlayer.playVlc(fileName); }else if(audioType.equalsIgnoreCase("mp4")){ advancedMediaPlayer.playMp4(fileName); } } } public class AudioPlayer implements MediaPlayer { MediaAdapter mediaAdapter; public void play(String audioType, String fileName) { if(audioType.equalsIgnoreCase("mp3")){ System.out.println("Playing mp3 file. Name: " + fileName); }else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){ mediaAdapter = new MediaAdapter(audioType); mediaAdapter.play(audioType, fileName); }else{ System.out.println("Invalid media. " + audioType + " format not supported"); } } } ``` 解释:MediaPlayer是一个接口,定义了play()方法;AdvancedMediaPlayer是另一个接口,定义了播放不同格式音频的方法;VlcPlayer和Mp4Player都实现了AdvancedMediaPlayer接口;MediaAdapter是一个适配器类,实现了MediaPlayer接口并包装了AdvancedMediaPlayer对象;AudioPlayer是另一个类,实现了MediaPlayer接口并根据不同的音频格式选择不同的播放方式。 7. 命令模式 命令模式是一种行为设计模式,用于将请求封装为对象,使得可以用不同的请求来参数化客户端,将请求排队或记录请求日志,以及支持可撤销的操作。 ```java public interface Command { void execute(); } public class Light { public void on(){ System.out.println("Light is on"); } public void off(){ System.out.println("Light is off"); } } public class LightOnCommand implements Command { Light light; public LightOnCommand(Light light){ this.light = light; } public void execute(){ light.on(); } } public class LightOffCommand implements Command { Light light; public LightOffCommand(Light light){ this.light = light; } public void execute(){ light.off(); } } public class RemoteControl { Command[] onCommands; Command[] offCommands; public RemoteControl(){ onCommands = new Command[7]; offCommands = new Command[7]; for (int i = 0; i < 7; i++){ onCommands[i] = () -> {}; offCommands[i] = () -> {}; } } public void setCommand(int slot, Command onCommand, Command offCommand){ onCommands[slot] = onCommand; offCommands[slot] = offCommand; } public void onButtonPressed(int slot){ onCommands[slot].execute(); } public void offButtonPressed(int slot){ offCommands[slot].execute(); } } ``` 解释:Command是一个接口,定义了execute()方法;Light是一个具体类,定义了开灯和关灯的方法;LightOnCommand和LightOffCommand都实现了Command接口,并将Light对象作为构造函数的参数;RemoteControl是一个遥控器类,维护了一个开灯和关灯的命令列表,并提供了绑定命令和执行命令的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值