| //[C] 2002 Sun Microsystems, Inc.---
 import java.util.ArrayList;
 
 public class RunBridgePattern {
 public static void main(String [] arguments){
 System.out.println("Example for the Bridge pattern");
 System.out.println();
 System.out.println("This example divides complex behavior among two");
 System.out.println(" classes - the abstraction and the implementation.");
 System.out.println();
 System.out.println("In this case, there are two classes which can provide the");
 System.out.println(" abstraction - BaseList and OrnamentedList. The BaseList");
 System.out.println(" provides core funtionality, while the OrnamentedList");
 System.out.println(" expands on the model by adding a list character.");
 System.out.println();
 System.out.println("The OrderedListImpl class provides the underlying storage");
 System.out.println(" capability for the list, and can be flexibly paired with");
 System.out.println(" either of the classes which provide the abstraction.");
 
 System.out.println("Creating the OrderedListImpl object.");
 ListImpl implementation = new OrderedListImpl();
 
 System.out.println("Creating the BaseList object.");
 BaseList listOne = new BaseList();
 listOne.setImplementor(implementation);
 System.out.println();
 
 System.out.println("Adding elements to the list.");
 listOne.add("One");
 listOne.add("Two");
 listOne.add("Three");
 listOne.add("Four");
 System.out.println();
 
 System.out.println("Creating an OrnamentedList object.");
 OrnamentedList listTwo = new OrnamentedList();
 listTwo.setImplementor(implementation);
 listTwo.setItemType('+');
 System.out.println();
 
 System.out.println("Creating an NumberedList object.");
 NumberedList listThree = new NumberedList();
 listThree.setImplementor(implementation);
 System.out.println();
 
 System.out.println("Printing out first list (BaseList)");
 for (int i = 0; i < listOne.count(); i++){
 System.out.println("\t" + listOne.get(i));
 }
 System.out.println();
 
 System.out.println("Printing out second list (OrnamentedList)");
 for (int i = 0; i < listTwo.count(); i++){
 System.out.println("\t" + listTwo.get(i));
 }
 System.out.println();
 
 System.out.println("Printing our third list (NumberedList)");
 for (int i = 0; i < listThree.count(); i++){
 System.out.println("\t" + listThree.get(i));
 }
 }
 }
 interface ListImpl{
 public void addItem(String item);
 public void addItem(String item, int position);
 public void removeItem(String item);
 public int getNumberOfItems();
 public String getItem(int index);
 public boolean supportsOrdering();
 }
 class BaseList{
 protected ListImpl implementor;
 
 public void setImplementor(ListImpl impl){
 implementor = impl;
 }
 
 public void add(String item){
 implementor.addItem(item);
 }
 public void add(String item, int position){
 if (implementor.supportsOrdering()){
 implementor.addItem(item, position);
 }
 }
 
 public void remove(String item){
 implementor.removeItem(item);
 }
 
 public String get(int index){
 return implementor.getItem(index);
 }
 
 public int count(){
 return implementor.getNumberOfItems();
 }
 }
 
 class NumberedList extends BaseList{
 public String get(int index){
 return (index + 1) + ". " + super.get(index);
 }
 }
 
 class OrderedListImpl implements ListImpl{
 private ArrayList items = new ArrayList();
 
 public void addItem(String item){
 if (!items.contains(item)){
 items.add(item);
 }
 }
 public void addItem(String item, int position){
 if (!items.contains(item)){
 items.add(position, item);
 }
 }
 
 public void removeItem(String item){
 if (items.contains(item)){
 items.remove(items.indexOf(item));
 }
 }
 
 public boolean supportsOrdering(){
 return true;
 }
 
 public int getNumberOfItems(){
 return items.size();
 }
 
 public String getItem(int index){
 if (index < items.size()){
 return (String)items.get(index);
 }
 return null;
 }
 }
 
 class OrnamentedList extends BaseList{
 private char itemType;
 
 public char getItemType(){ return itemType; }
 public void setItemType(char newItemType){
 if (newItemType > ' '){
 itemType = newItemType;
 }
 }
 
 public String get(int index){
 return itemType + " " + super.get(index);
 }
 }
 
 
 
 
 |