using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IteratorPattern.AggregateOne
{
///
/// 聚合对象,定义创建相应迭代器对象的接口
///
internal abstract class Aggregate
{
//工厂方法,场景相应迭代器对象的接口
public abstract Itetator CreateIterator();
//获取对象
public abstract object Get(int index);
//获取对象大小
public abstract int Size();
}//Class_end
}
4、分别让具体的聚合对象继承抽象来分别提供访问它们的聚合接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IteratorPattern.AggregateOne
{
///
/// 客户方已有的工资管理对象
///
internal class PayManager:Aggregate
{
//聚合对象
private List payModels = new List();
///
/// 获取工资列表
///
///
public List GetPayModels()
{
return payModels;
}
///
/// 计算工资(正常来说应该有很多参数,我们只是演示就从简了)
///
public void CaculatePay()
{
//计算工资,把工资信息填充到工资条中
//为了测试,需要一些测试数据
PayModel payModel1 = new PayModel();
payModel1.UserName = "张三";
payModel1.Pay = 9600;
payModels.Add(payModel1);
PayModel payModel2 = new PayModel();
payModel2.UserName = "李四";
payModel2.Pay = 10000;
payModels.Add(payModel2);
PayModel payModel3 = new PayModel();
payModel3.UserName = "王五";
payModel3.Pay = 12000;
payModels.Add(payModel3);
}
public override Itetator CreateIterator()
{
return new CollectionIteratorImpl(this);
}
public override object Get(int index)
{
object obj = null;
if (index
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IteratorPattern.AggregateOne
{
///
/// 被客户方收购公司的工资管理类
///
internal class SalaryManager:Aggregate
{
//用数组管理
private PayModel[] payModels=new PayModel[3];
///
/// 获取工资列表
///
///
public PayModel[] GetPayModels()
{
return payModels;
}
///
/// 计算工资(正常来说应该有很多参数,我们只是演示就从简了)
///
public void CaculatePay()
{
//计算工资,把工资信息填充到工资条中
//为了测试,需要一些测试数据
PayModel payModel1 = new PayModel();
payModel1.UserName = "赵六";
payModel1.Pay = 9000;
payModels[0]=payModel1;
PayModel payModel2 = new PayModel();
payModel2.UserName = "孙七";
payModel2.Pay = 13000;
payModels[1] = payModel2;
PayModel payModel3 = new PayModel();
payModel3.UserName = "李八";
payModel3.Pay = 15000;
payModels[2] = payModel3;
}
public override Itetator CreateIterator()
{
return new ArrayIteratorImpl(this);
}
public override object Get(int index)
{
object obj = null;
if (index
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IteratorPattern.PageTurning
{
///
/// 定义翻页访问聚合元素的迭代接口
///
internal interface IAggregateIterator
{
///
/// 判断是否还有下一个元素(无论是否足够一页的数据)因为最后哪怕只有一条数据也算一页
///
/// 若有下一个元素则返回true;否则就返回false
bool hasNext();
///
/// 取出后面的几个元素
///
/// 需取出的记录条数
///
List
2、工资模型保持不变
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IteratorPattern.PageTurning
{
///
/// 定义翻页访问聚合元素的迭代接口
///
internal interface IAggregateIterator
{
///
/// 判断是否还有下一个元素(无论是否足够一页的数据)因为最后哪怕只有一条数据也算一页
///
/// 若有下一个元素则返回true;否则就返回false
bool hasNext();
///
/// 取出后面的几个元素
///
/// 需取出的记录条数
///
List Next(int totalNum);
///
/// 判断是否有上一个元素(无论是否够一页的数据)因为最后哪怕只有一条数据也要算一页
///
/// 若有上一个元素则返回true;否则返回false
bool hasPrevious();
///
/// 取出前面的几个元素
///
/// 需获取的记录条数
///
List Previous(int totalNum);
}//Interface_end
}
3、薪资管理类实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IteratorPattern.PageTurning
{
///
/// 被客户方收购公司的工资管理类
///
internal class SalaryManager
{
//用数组管理
private PayModel[] payModels=new PayModel[5];
///
/// 获取工资列表
///
///
public PayModel[] GetPayModels()
{
return payModels;
}
///
/// 计算工资(正常来说应该有很多参数,我们只是演示就从简了)
///
public void CaculatePay()
{
//计算工资,把工资信息填充到工资条中
//为了测试,需要一些测试数据
PayModel payModel1 = new PayModel();
payModel1.UserName = "赵六";
payModel1.Pay = 9000;
payModels[0]=payModel1;
PayModel payModel2 = new PayModel();
payModel2.UserName = "孙七";
payModel2.Pay = 13000;
payModels[1] = payModel2;
PayModel payModel3 = new PayModel();
payModel3.UserName = "李八";
payModel3.Pay = 15000;
payModels[2] = payModel3;
PayModel payModel4 = new PayModel();
payModel4.UserName = "孙七二";
payModel4.Pay = 9000;
payModels[3] = payModel4;
PayModel payModel5 = new PayModel();
payModel5.UserName = "李七二";
payModel5.Pay = 9000;
payModels[4] = payModel5;
}
public IAggregateIterator CreateIterator()
{
return new ArrayIteratorImpl(this);
}
}//Class_end
}
4、创建继承迭代器接口类实现具体的方法
using IteratorPattern.AggregateOne;
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IteratorPattern.PageTurning
{
///
/// 用来实现访问数组的迭代接口
///
internal class ArrayIteratorImpl : IAggregateIterator
{
//用来存放被迭代的数组
private PayModel[] payModels = null;
//用来记录当前迭代的位置索引
private int index = 0;
///
/// 构造函数
///
/// 被客户方收购公司的工资管理类
public ArrayIteratorImpl(SalaryManager salaryManager)
{
this.payModels = salaryManager.GetPayModels();
}
public bool hasNext()
{
if (payModels!=null && index<=(payModels.Length-1))
{
return true;
}
return false;
}
public bool hasPrevious()
{
if (payModels!=null && index>0)
{
return true;
}
return false;
}
public List Next(int totalNum)
{
List list = new List();
int count = 0;
while (hasNext() && count Previous(int totalNum)
{
List list = new List();
int count = 0;
//简单的实现就是把索引退回去totalNum个,然后在取值;但事实上这种实现是有可能多退回数据的,
//比如:已经到了最后一页,而且最后一页的数据不够一页的数据,那么退回totalNum个索引就退多了
//为了示例的简洁性,我们就不去处理了
index = index - totalNum;
while (hasPrevious() && count
5、客户端测试翻页
namespace IteratorPattern
{
internal class Program
{
static void Main(string[] args)
{
PageTurningTest();
Console.ReadLine();
}
///
/// 测试翻页
///
private static void PageTurningTest()
{
Console.WriteLine("---测试翻页---");
//访问新收购公司的工资列表
PageTurning.SalaryManager salaryManager = new PageTurning.SalaryManager();
salaryManager.CaculatePay();
//得到翻页迭代器
PageTurning.IAggregateIterator ir=salaryManager.CreateIterator();
//获取第一页,每页显示2条
List list = ir.Next(2);
Console.WriteLine($"第一页数据:");
Print2(list);
//获取第二页,每页显示2条
List list2 = ir.Next(2);
Console.WriteLine($"第二页数据:");
Print2(list2);
//向前翻一页(即再次获取第二页)
List list3 = ir.Previous(2);
Console.WriteLine($"再次获取第二页数据:");
Print2(list3);
}
private static void Print2(List list)
{
foreach (var item in list)
{
Console.WriteLine(item);
}
}
}//Class_end
}
6、运行结果
2.4、翻页迭代——随机翻页
1、定义迭代接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IteratorPattern.RandomPageTurning
{
///
/// 定义随机翻页访问聚合元素的迭代接口
///
internal interface IAggregationIterator where T : class
{
///
/// 判断是否还有下一个元素,无所谓是否够一页的数据,因为最后哪怕只有一条数据也是算作一页
///
/// 如果有下一个元素则返回true,否则返回false
public bool HasNext();
///
/// 判断是否还有上一个元素,无所谓是否够一页的数据,因为最后哪怕只有一条数据也是算作一页
///
/// 如果有上一个元素则返回true,否则返回false
public bool HasPrevious();
///
/// 取指定页的数据
///
/// 需获取数据的页码
/// 每页展示的数据条数
///
public T[] GetPageDatas(int pageNum,int pageShow);
}//Interface_end
}
2、定义具体的类继承该接口并实现方法内容
using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IteratorPattern.RandomPageTurning
{
internal class ArrayIteratorImpl : IAggregationIterator
{
//用来存放被迭代的数组
private PayModel[] payModels = null;
//用来记录当前迭代到的索引位置
private int index = 0;
///
/// 构造函数
///
/// 薪资管理对象
public ArrayIteratorImpl(SalaryManager salaryManager)
{
this.payModels = salaryManager.GetPayModels();
}
public PayModel[] GetPageDatas(int pageNum, int pageShow)
{
PayModel[] payModelArray = new PayModel[pageShow];
//需要先计算需获取的数据开始条数和结束条数
int start = (pageNum - 1) * pageShow;
int end = start + pageShow - 1;
//控制start的边界,最小是0
if (start<0)
{
start = 0;
}
//控制end的边界,最大是数组的最大索引
if (end>this.payModels.Length-1)
{
end = this.payModels.Length - 1;
}
//每次取值都是从头开始循环,所以设置index=0
index = 0;
while (HasNext() && start<=end)
{
payModelArray[index] = payModels[start];
start++;
index++;
}
return payModelArray;
}
public bool HasNext()
{
if (payModels!=null && index0)
{
return true;
}
return false;
}
}//Class_end
}
3、给客户收购公司的薪水管理类新增该迭代接口的实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IteratorPattern.RandomPageTurning
{
///
/// 被客户方收购公司的工资管理类
///
internal class SalaryManager
{
//用数组管理
private PayModel[] payModels=new PayModel[5];
///
/// 获取工资列表
///
///
public PayModel[] GetPayModels()
{
return payModels;
}
///
/// 计算工资(正常来说应该有很多参数,我们只是演示就从简了)
///
public void CaculatePay()
{
//计算工资,把工资信息填充到工资条中
//为了测试,需要一些测试数据
PayModel payModel1 = new PayModel();
payModel1.UserName = "赵六";
payModel1.Pay = 9000;
payModels[0] = payModel1;
PayModel payModel2 = new PayModel();
payModel2.UserName = "孙七";
payModel2.Pay = 13000;
payModels[1] = payModel2;
PayModel payModel3 = new PayModel();
payModel3.UserName = "李八";
payModel3.Pay = 15000;
payModels[2] = payModel3;
PayModel payModel4 = new PayModel();
payModel4.UserName = "孙七二";
payModel4.Pay = 9000;
payModels[3] = payModel4;
PayModel payModel5 = new PayModel();
payModel5.UserName = "李七二";
payModel5.Pay = 9000;
payModels[4] = payModel5;
}
public IAggregationIterator CreateIterator()
{
return new ArrayIteratorImpl(this);
}
}//Class_end
}
转自于:http://www.iteye.com/problems/23775
问:
我在开发过程中,使用hql进行查询(mysql5)使用到了mysql自带的函数find_in_set()这个函数作为匹配字符串的来讲效率非常好,但是我直接把它写在hql语句里面(from ForumMemberInfo fm,ForumArea fa where find_in_set(fm.userId,f
1、下载软件 rzsz-3.34.tar.gz。登录linux,用命令
wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz下载。
2、解压 tar zxvf rzsz-3.34.tar.gz
3、安装 cd rzsz-3.34 ; make posix 。注意:这个软件安装与常规的GNU软件不
Forwarded port
Private network
Public network
Vagrant 中一共有三种网络配置,下面我们将会详解三种网络配置各自优缺点。
端口映射(Forwarded port),顾名思义是指把宿主计算机的端口映射到虚拟机的某一个端口上,访问宿主计算机端口时,请求实际是被转发到虚拟机上指定端口的。Vagrantfile中设定语法为:
c
Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or ve